Flutter中const修饰的NumberForm添加TextFormField报位置参数错误
Flutter NumberForm传TextFormField报位置参数过多问题修复
报错信息
Flutter开发过程中,在const修饰的NumberForm组件内传入绑定了已定义TextEditingController实例的TextFormField时,触发如下报错:
Too many positional arguments: 0 expected, but 1 found.
Try removing the extra positional arguments, or specifying the name for named arguments.
(报错含义:位置参数数量过多,组件预期接收0个位置参数,实际传入了1个。建议移除多余的位置参数,或为传入的参数指定命名参数名称)
出错原始代码
const NumberForm( text: "Team number", formText: "Enter team number", padding: 0, TextFormField( // 报错触发位置 controller: nameteamController, ) ),
报错原因
NumberForm组件未定义可接收的位置参数,所有支持传入的参数均为命名参数,直接无参数名传入TextFormField属于非法位置参数,组件无法匹配到对应的接收字段,直接触发参数数量不匹配错误。NumberForm前的const修饰符不符合使用场景:传入的TextFormField绑定了运行时初始化的TextEditingController实例,不属于编译期常量,即使参数名修正后也会触发常量构造错误,必须移除const关键字。
修复方案
根据NumberForm的组件定义分两种情况处理:
- 组件通过
child参数接收外部传入的子组件
移除const修饰,将TextFormField显式赋值给child命名参数即可:NumberForm( text: "Team number", formText: "Enter team number", padding: 0, child: TextFormField( controller: nameteamController, ) ), - 组件为封装好的表单组件,不需要外部传入完整
TextFormField
给自定义NumberForm新增controller命名参数,在组件内部构建TextFormField时绑定传入的controller,外部调用时直接传controller实例即可:// NumberForm组件定义调整 class NumberForm extends StatelessWidget { final String text; final String formText; final double padding; final TextEditingController? controller; const NumberForm({ super.key, required this.text, required this.formText, required this.padding, this.controller, }); @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(text), TextFormField( controller: controller, decoration: InputDecoration(hintText: formText), ), SizedBox(height: padding) ], ); } } // 外部调用代码 NumberForm( text: "Team number", formText: "Enter team number", padding: 0, controller: nameteamController, )
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

