keyboard_guide_controller.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:get/get.dart';
  3. import 'package:injectable/injectable.dart';
  4. import 'package:keyboard/resource/string.gen.dart';
  5. import '../../base/base_controller.dart';
  6. import '../../data/bean/keyboard_guide_msg.dart';
  7. import '../../utils/toast_util.dart';
  8. /// 键盘引导页面Controller
  9. @injectable
  10. class KeyboardGuidePageController extends BaseController {
  11. /// TextField操作控制器
  12. final TextEditingController editingController = TextEditingController();
  13. /// ListView的滚动控制器
  14. final ScrollController scrollController = ScrollController();
  15. /// 输入框焦点
  16. final FocusNode inputFocusNode = FocusNode();
  17. /// 消息列表
  18. final RxList<KeyboardGuideMsg> msgList = <KeyboardGuideMsg>[].obs;
  19. @override
  20. void onInit() {
  21. super.onInit();
  22. inputFocusNode.addListener(_handleTextFieldFocusChange);
  23. // 初始化消息列表
  24. _initMsgList();
  25. // 进入页面,就获取输入框焦点
  26. // inputFocusNode.requestFocus();
  27. }
  28. @override
  29. void onClose() {
  30. // 取消监听
  31. inputFocusNode.removeListener(_handleTextFieldFocusChange);
  32. inputFocusNode.dispose();
  33. editingController.dispose();
  34. scrollController.dispose();
  35. super.onClose();
  36. }
  37. /// 关闭页面
  38. clickBack() {
  39. Get.back();
  40. }
  41. /// 发送消息
  42. void sendMsg(String msg) {
  43. if (msg.isEmpty) {
  44. ToastUtil.show("请输入要发送的消息内容");
  45. return;
  46. }
  47. //添加消息到列表中
  48. _addMsg2List(msg, true);
  49. // 延迟生成对方的回复消息
  50. // Future.delayed(const Duration(milliseconds: 150), () {
  51. // //添加消息到列表中
  52. // _addMsg2List(_replyMessage2Client(msg), false);
  53. // });
  54. //清除输入框的内容
  55. editingController.clear();
  56. }
  57. // /// 测试,生成回复消息
  58. // String _replyMessage2Client(String clientMsg) {
  59. // return clientMsg
  60. // .replaceAll("我", "你")
  61. // .replaceAll("吗", "")
  62. // .replaceAll("?", "!")
  63. // .replaceAll("?", "!");
  64. // }
  65. /// 初始化消息列表
  66. void _initMsgList() {
  67. // 添加一些默认消息
  68. msgList.add(
  69. KeyboardGuideMsg(
  70. isMe: false,
  71. content: StringName.keyboardGuideTaReply1,
  72. createTime: DateTime.now().millisecond,
  73. ),
  74. );
  75. msgList.add(
  76. KeyboardGuideMsg(
  77. isMe: false,
  78. content: StringName.keyboardGuideTaReply2,
  79. createTime: DateTime.now().millisecond,
  80. ),
  81. );
  82. msgList.add(
  83. KeyboardGuideMsg(
  84. isMe: false,
  85. content: StringName.keyboardGuideTaReply3,
  86. createTime: DateTime.now().millisecond,
  87. ),
  88. );
  89. }
  90. /// 添加消息到消息列表中
  91. void _addMsg2List(String msg, bool isMe) {
  92. msgList.add(
  93. KeyboardGuideMsg(
  94. isMe: isMe,
  95. content: msg,
  96. createTime: DateTime.now().millisecond,
  97. ),
  98. );
  99. update();
  100. _scrollToBottom();
  101. }
  102. /// 滚动列表到底部
  103. void _scrollToBottom() {
  104. if (scrollController.hasClients) {
  105. scrollController.jumpTo(scrollController.position.maxScrollExtent);
  106. }
  107. }
  108. /// 处理输入框的焦点变化
  109. void _handleTextFieldFocusChange() {
  110. // 输入框获取焦点,滚动列表到底部
  111. if (inputFocusNode.hasFocus) {
  112. Future.delayed(const Duration(milliseconds: 350), () {
  113. _scrollToBottom();
  114. });
  115. }
  116. }
  117. }