如何将自定义TextFormField的onSaved值传递给其他组件?
问题解决:可复用TextFormField的onSaved与validator传递
1. 初始错误:Undefined class 'value'
这个错误是因为你定义onSaved回调时,没有给参数指定明确类型。Dart是强类型语言,必须明确函数参数的类型。
TextFormField的onSaved参数类型为void Function(String?)?(输入值可能为null),所以InputName类里的onSaved应修正为:
final void Function(String?)? onSaved;
原代码里的Function(value)? onSaved未声明value的类型,导致Dart将其识别为类名,从而触发报错。
2. 更新后代码功能失效的问题
你更新后的代码存在两个核心问题:
- 未正确调用传递进来的回调函数,也未传递参数
validator的类型定义错误,TextFormField的validator实际类型是String? Function(String?)?,而非Function(String)?
修正后的完整代码
可复用InputName Widget
class InputName extends StatefulWidget { final TextEditingController controller; // 匹配TextFormField的onSaved类型 final void Function(String?)? onSaved; // 匹配TextFormField的validator类型 final String? Function(String?)? validator; const InputName({ Key? key, required this.controller, this.onSaved, this.validator, }) : super(key: key); @override State<InputName> createState() => _InputNameState(); } class _InputNameState extends State<InputName> { @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.only(left: 16.0, right: 16), child: TextFormField( keyboardType: TextInputType.text, controller: widget.controller, style: const TextStyle(fontSize: 20, height: 0.6), // 直接复用传递的validator(类型匹配可直接赋值) validator: widget.validator, // 直接复用传递的onSaved(类型匹配可直接赋值) onSaved: widget.onSaved, ), ); } }
使用InputName的代码
InputName( controller: _nameController, onSaved: (value) { // 处理value可能为null的情况 _categoryName = value ?? ''; }, validator: (value) { if (value?.isEmpty ?? true) { return 'Please enter a name'; } return null; }, )
关键要点说明
- 类型严格匹配:必须和TextFormField对应参数的类型完全一致,否则会出现类型不兼容或功能失效的问题
- 简洁赋值方式:因为定义的回调类型和TextFormField的参数类型完全匹配,所以可以直接将
widget.onSaved、widget.validator赋值给对应参数,无需额外包装 - null安全处理:TextFormField的回调参数可能为null,使用时要通过
??或空值判断处理,避免空指针异常
内容的提问来源于stack exchange,提问作者Giovanni
相关产品推荐
相关产品推荐

