Dart中TextFormField的validator、onSaved参数类型不匹配报错如何解决?
报错原因
该类型不匹配报错由Dart空安全机制触发:Flutter TextFormField 组件的两个回调参数默认使用可空类型定义:
validator要求匹配的函数类型为String? Function(String?)?,入参为可空字符串onSaved要求匹配的函数类型为void Function(String?)?,入参为可空字符串
你当前自定义的校验方法、onSaved 回调的入参都声明为非空String,和组件要求的参数类型不匹配,因此抛出错误。
修复方案
第一步:修改校验器类的入参类型
将两个校验方法的入参从String改为String?,同时补充空值判断逻辑,覆盖输入为null的场景:
class EmailFieldValidator { static String? validate(String? value) { return value == null || value.isEmpty ? 'Email can\'t be empty' : null; } } class PasswordFieldValidator { static String? validate(String? value) { return value == null || value.isEmpty ? 'Password can\'t be empty' : null; } }
第二步:修改onSaved回调的入参类型
将onSaved的入参声明改为String?,因为在校验通过的前提下输入内容一定非空,赋值时可以直接使用非空断言!:
List<Widget> buildInputs() { return <Widget>[ TextFormField( key: Key('email'), decoration: InputDecoration(labelText: 'Email'), validator: EmailFieldValidator.validate, onSaved: (String? value) => _email = value!, ), TextFormField( key: Key('password'), decoration: InputDecoration(labelText: 'Password'), obscureText: true, validator: PasswordFieldValidator.validate, onSaved: (String? value) => _password = value!, ), ]; }
如果不想使用非空断言,也可以给参数设置默认空字符串:value ?? ''。
内容的提问来源于stack exchange,提问作者Mithson
相关产品推荐
相关产品推荐

