Flutter传递RequiredValidator为表单校验参数时类型不匹配如何解决
问题根因
form_field_validator包提供的RequiredValidator等校验类是实现了call方法的可调用对象,默认不会被Dart隐式转换为TextFormField要求的String? Function(String?)校验函数类型。你直接在TextFormField的validator参数传校验实例时,Dart可以通过上下文类型推导自动完成转换,但封装中间层方法时用var声明动态参数,打断了类型推导链路,因此抛出类型不匹配错误。
解决步骤
- 明确封装的input方法的validator参数类型,不要使用动态类型
var,声明为Flutter表单通用的校验函数类型FormFieldValidator<String?> - 传入校验实例时,显式获取它的call方法引用,或者用匿名函数包裹执行校验逻辑
修改后的组件代码
Widget input(String name, String value, FormFieldValidator<String?> validator) { return Padding( padding: EdgeInsets.only( left: responsiveWidth(20), right: responsiveWidth(20)), child: Column( children: [ Text(name), SizedBox( height: responsiveHeight(10), ), Container( width: SizeConfig.screenWidth * 0.9, child: TextFormField( validator: validator, decoration: inputDecoration(context, value), ), ), ], ), ); }
调用代码(两种写法均可)
写法1:函数 tear-off 简写(推荐,代码更简洁)
input("Email", "email@gmail.com", RequiredValidator(errorText: "Required").call )
写法2:匿名函数包裹(适合多规则组合场景)
input("Email", "email@gmail.com", (value) => MultiValidator([ RequiredValidator(errorText: "Required"), EmailValidator(errorText: "请输入合法邮箱") ]).call(value) )
内容的提问来源于stack exchange,提问作者MU'men Ahmed
相关产品推荐
相关产品推荐

