import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:injectable/injectable.dart'; import 'package:keyboard/module/keyboard_guide/enums/keyboard_guide_msg_type.dart'; import 'package:keyboard/resource/string.gen.dart'; import '../../base/base_controller.dart'; import '../../data/bean/keyboard_guide_msg.dart'; import '../../plugins/default_keyboard_change_listener.dart'; import '../../plugins/keyboard_android_platform.dart'; import '../../utils/keyboard_guide_record_util.dart'; import '../../utils/toast_util.dart'; import 'guide_overlay/keyboard_guide_overlay_dialog.dart'; /// 键盘引导页面Controller @injectable class KeyboardGuidePageController extends BaseController { /// 引导消息的GlobalKey final GlobalKey guideMsgGlobalKey = GlobalKey(); /// 第几条消息为引导消息 final Rx guideMsgIndex = 1.obs; /// TextField操作控制器 final TextEditingController editingController = TextEditingController(); /// ListView的滚动控制器 final ScrollController scrollController = ScrollController(); /// 输入框焦点 final FocusNode inputFocusNode = FocusNode(); /// 消息列表 final RxList msgList = [].obs; /// 是否选择为了默认键盘 final Rx isChooseDefaultKeyboard = false.obs; @override void onInit() { super.onInit(); inputFocusNode.addListener(_handleTextFieldFocusChange); // 初始化消息列表 _initMsgList(); // 进入页面,就获取输入框焦点 // inputFocusNode.requestFocus(); _registerDefaultKeyboardChangeEvent(); } @override void onClose() { // 取消监听 inputFocusNode.removeListener(_handleTextFieldFocusChange); inputFocusNode.dispose(); editingController.dispose(); scrollController.dispose(); _unRegisterDefaultKeyboardChangeEvent(); super.onClose(); } /// 监听默认键盘切换事件 void _registerDefaultKeyboardChangeEvent() { DefaultKeyboardMonitor.registerDefaultKeyboardChangeEvent( handleDefaultKeyboardChange, ); } /// 取消监听默认键盘切换事件 void _unRegisterDefaultKeyboardChangeEvent() { DefaultKeyboardMonitor.unRegisterDefaultKeyboardChangeEvent( handleDefaultKeyboardChange, ); } /// 处理默认键盘切换 void handleDefaultKeyboardChange(bool isDefaultKeyboard) { isChooseDefaultKeyboard.value = isDefaultKeyboard; } /// 关闭页面 clickBack() { Get.back(); } /// 发送消息 void sendMsg(String msg) { if (msg.isEmpty) { ToastUtil.show("请输入要发送的消息内容"); return; } //添加消息到列表中 _addMsg2List(msg, true); // 延迟生成对方的回复消息 // Future.delayed(const Duration(milliseconds: 150), () { // //添加消息到列表中 // _addMsg2List(_replyMessage2Client(msg), false); // }); //清除输入框的内容 editingController.clear(); } // /// 测试,生成回复消息 // String _replyMessage2Client(String clientMsg) { // return clientMsg // .replaceAll("我", "你") // .replaceAll("吗", "") // .replaceAll("?", "!") // .replaceAll("?", "!"); // } /// 初始化消息列表 void _initMsgList() { // 添加一些默认消息 msgList.add( KeyboardGuideMsg( false, StringName.keyboardGuideTaReply1, KeyboardGuideMsgType.copy.type, DateTime.now().millisecond, ), ); msgList.add( KeyboardGuideMsg( false, StringName.keyboardGuideTaReply2, KeyboardGuideMsgType.copy.type, DateTime.now().millisecond, ), ); msgList.add( KeyboardGuideMsg( false, StringName.keyboardGuideTaReply3, KeyboardGuideMsgType.copy.type, DateTime.now().millisecond, ), ); // 亲密度设置的引导消息 msgList.add( KeyboardGuideMsg( false, StringName.keyboardGuideTaReply4, KeyboardGuideMsgType.intimacySetting.type, DateTime.now().millisecond, ), ); } /// 添加消息到消息列表中 void _addMsg2List(String msg, bool isMe) { msgList.add( KeyboardGuideMsg( isMe, msg, KeyboardGuideMsgType.normal.type, DateTime.now().millisecond, ), ); update(); _scrollToBottom(); } /// 滚动列表到底部 void _scrollToBottom() { if (scrollController.hasClients) { scrollController.jumpTo(scrollController.position.maxScrollExtent); } } /// 处理输入框的焦点变化 void _handleTextFieldFocusChange() { // 输入框获取焦点,滚动列表到底部 if (inputFocusNode.hasFocus) { Future.delayed(const Duration(milliseconds: 350), () { _scrollToBottom(); }); } } /// 显示引导覆盖层弹窗 void showGuideOverlayDialog() { // 显示过引导弹窗,则不显示 if (!KeyboardGuideRecordUtil.isFirstShowKeyboardGuide()) { return; } // 首帧结束后,再显示 WidgetsBinding.instance.addPostFrameCallback((_) { KeyboardGuideOverlayDialog.show( guideMsgGlobalKey, onFinishCallback: () { // 设置未非首次显示 KeyboardGuideRecordUtil.setFirstShowKeyboardGuide(false); }, ); }); } }