Flutter TextField onSubmitted绑定函数引用不生效问题
Flutter 表单提交回调绑定失效问题修复
问题根因
- 第二个TextField无响应的直接原因是写法错误:
onSubmitted: (_)=>myf使用箭头函数时,仅返回了myf的函数对象本身,没有执行myf(),回调触发时不会运行提交逻辑。 - 直接给
onSubmitted传myf引用不生效的核心原因是函数签名不匹配:TextField的onSubmitted是ValueChanged<String>类型,要求回调必须接收1个String类型的入参(即输入框当前提交的文本值)- 自定义的
myf()是无参函数,和onSubmitted要求的函数签名不兼容,无法被正常调用 TextButton的onPressed是VoidCallback类型,要求无参无返回值,和myf()签名完全匹配,所以直接传引用可以正常运行
修正方案
快速修复(保留原有myf定义)
把第二个TextField的错误写法改成调用执行即可,两种写法都可以:
// 写法1:代码块内调用 onSubmitted: (_) { myf(); }, // 写法2:箭头函数直接执行,注意必须加括号 onSubmitted: (_) => myf(),
规范优化(支持直接传函数引用)
调整myf的参数定义,让它同时兼容onSubmitted的带参签名和onPressed的无参签名,后续所有位置都可以直接传函数引用,不需要额外包匿名函数:
// 增加可选的位置参数,接收onSubmitted传入的文本值,不需要使用时用_标记忽略 void myf([String? _]) { func(txttitle.text,double.parse(txtamount.text)); }
调整后组件内的回调绑定可以统一简写为:
TextField( controller: txttitle, onSubmitted: myf, decoration: InputDecoration(labelText: 'Enter Title'), ), TextField( onSubmitted: myf, keyboardType: TextInputType.number, controller: txtamount, decoration: InputDecoration(labelText: 'Enter Amount') ), TextButton( onPressed: myf, child: Text('Add Record') )
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

