我在Flutter中有一个异步函数,它将验证器的值作为参数:
validatePhone(number) {
bool _isValid;
Requests.get("http://apilayer.net/api/validate?value=$number", json: true)
.then((val) {
if (val['valid']) {
// setState(() { <- also tried setting state here
_isValid = true;
// });
} else {
// setState(() {
_isValid = false;
// });
}
});
return _isValid;
}
和
TextFormField(
validator: (value) {
if (value.isEmpty) {
return 'Please your phone number';
} else {
if (validatePhone(value)) {
return 'Your phone number is not valid';
}
}
},
),
但它不工作,它总是返回null
或validatePhone
中设置的初始值。你知道我该怎么做吗?
2条答案
按热度按时间xpszyzbs1#
看看flutter_form_bloc,它支持异步验证器,你可以设置反跳时间,除了提供其他优点。
您可以在没有
FormBloc
的情况下使用TextFieldBloc
,但如果在FormBloc
中使用,则功能会更强大.
Example #1 -无FormBloc
Example #2 -使用FormBloc
ryoqjall2#
正如评论中所说,不可能有异步验证器,因为
validator
被期望为returnString
而不是“Future”。但是,代码中有许多错误。首先,
validatePhone
在_isValid
被设置之前返回,这就是为什么你会得到一个null
值,因为它从未被设置为任何值。您的请求在 *validatePhone
返回后 * 完成,此时设置_isValid
是无用的。让我们尝试修复validatePhone:
如你所见,它的返回值必须变成
Future<bool>
,而不是bool
。没有办法解决这个问题。如果允许validator
返回Future
,那么它就可以工作。您将不得不以一种痛苦的自定义方式实现验证逻辑。
**编辑:**这里来了一个自定义痛苦的方式:)
您需要一个表单键:
您的表单应该自动验证:
我不确定这是否可行,但值得一试。