keyboard_guide_controller.dart 3.7 KB

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