Flutter中Material Button回调正常,TextFormField为何失效?
Flutter子组件回调传递数据问题分析
核心差异原因
- TextFormField的onChanged未执行回调:在子组件的
onChanged回调中,你写了()=>callback(_fieldTextController.text);,这只是定义了一个匿名函数,但没有实际调用它。父组件完全没收到任何数据,所以始终是空字符串。 - MaterialButton的onPressed正确执行了回调:
onPressed:()=>callback("hellow")是将匿名函数赋值给了onPressed,当按钮被点击时,Flutter框架会自动执行这个函数,因此父组件能正常获取到数据。
修正方案
只需要修改子组件中TextFormField的onChanged代码,直接调用回调函数即可,不需要额外包裹一层未执行的匿名函数。
修正后的子组件代码片段
@override Widget build(BuildContext context){ return Padding( padding: const EdgeInsetsDirectional.fromSTEB(0, 0, 0, 20), child: TextFormField( controller: _fieldTextController, autofocus: true, obscureText: false, decoration: const ButtonDecoration().GetButtonDecoration(_title, _buttonIcon), textAlign: TextAlign.start, keyboardType: TextInputType.emailAddress, // 修正后的onChanged回调 onChanged: (value) { // 直接调用callback,两种方式选其一即可 callback(value); // 方式一:使用onChanged传入的当前文本值 // callback(_fieldTextController.text); // 方式二:使用控制器获取文本 } ), ); }
额外说明
其实onChanged回调本身就会传入当前输入框的最新文本值(即参数value),直接使用这个值传递给父组件会更简洁,不需要再通过_fieldTextController.text获取。
内容的提问来源于stack exchange,提问作者Riverreed Ward
相关产品推荐
相关产品推荐

