Flutter Windows端TextFormField切换焦点触发onFieldSubmitted及onChanged处理方案
Windows平台Flutter TextFormField焦点切换异常修复方案
仅适配Windows平台下的TextFormField异常:切换输入框时出现文本/数字重复,焦点丢失时不会主动触发
onFieldSubmitted回调,现有公开解决方案无法适配需求。
方案1:对齐onChanged与onFieldSubmitted的处理逻辑
统一两处的业务处理逻辑,避免逻辑差异导致的数值重复:
- 把原
onFieldSubmitted中的处理逻辑抽离为独立公共方法,入参为输入框的当前文本值 onChanged回调仅做输入合法性校验,不要执行数值存储、业务计算类操作,业务逻辑统一在提交节点触发- 若必须在
onChanged中执行业务逻辑,修改原有增量计算逻辑为全量替换逻辑,避免重复叠加
示例代码:
// 抽离公共处理逻辑 void handleInputSubmit(String value) { // 原onFieldSubmitted中的所有业务逻辑 if(value.isNotEmpty) { // 直接赋值替换,禁止使用 value = oldValue + newValue 这类增量操作 targetNum = int.tryParse(value) ?? 0; } } // 组件绑定 TextFormField( onChanged: (value) { // 仅做输入过滤,示例为限制只输入数字 final reg = RegExp(r'\d'); if (!reg.hasMatch(value)) return; }, onFieldSubmitted: handleInputSubmit, )
方案2:失去焦点时自动触发onFieldSubmitted回调
通过FocusNode监听焦点状态,当前输入框失去焦点时主动调用提交逻辑:
- 给每个TextFormField绑定独立的FocusNode实例
- 初始化时监听FocusNode的焦点变化,失去焦点时调用对应提交方法
- State销毁时要主动释放FocusNode资源,避免内存泄漏
示例代码:
class _InputPageState extends State<InputPage> { late final FocusNode focusNode1; late final FocusNode focusNode2; final TextEditingController controller1 = TextEditingController(); final TextEditingController controller2 = TextEditingController(); @override void initState() { super.initState(); focusNode1 = FocusNode(); focusNode2 = FocusNode(); // 监听第一个输入框焦点 focusNode1.addListener(() { if (!focusNode1.hasFocus) { // 失去焦点时主动触发提交 handleInputSubmit(controller1.text); } }); // 监听第二个输入框焦点 focusNode2.addListener(() { if (!focusNode2.hasFocus) { handleInputSubmit(controller2.text); } }); } @override void dispose() { focusNode1.dispose(); focusNode2.dispose(); controller1.dispose(); controller2.dispose(); super.dispose(); } // 公共提交逻辑 void handleInputSubmit(String value) { if(value.isEmpty) return; // 原有提交业务逻辑 } @override Widget build(BuildContext context) { return Column( children: [ TextFormField( focusNode: focusNode1, controller: controller1, onFieldSubmitted: handleInputSubmit, ), TextFormField( focusNode: focusNode2, controller: controller2, onFieldSubmitted: handleInputSubmit, ) ], ); } }
内容的提问来源于stack exchange,提问作者Thanh Le Dinh Hoai
相关产品推荐
相关产品推荐

