var _formKey = GlobalKey<FormState>();
var validate;
String validateNumber(String value){
if (value.isEmpty) {
return 'Please enter number';
}if(validate == true){
return "Phone number already exists";
}
return null;
}
addPhoneNumber(phoneNumber) async{
var exist = await db.checkPhoneNumber(phoneNumber); //my query to firestore so far i have no problem with this.
if(exist == true){
validate = true;
print(validate);
}
if(exist == false){
validate = false;
Navigator.of(context).push(_verifyPhone(_phoneNumber.text));
await db.addPhoneNumber(phoneNumber);
}
} //my function to detect if the number exists
@override
Widget build(BuildContext context) {
_get1();
return WillPopScope(
onWillPop: () async {
Navigator.pop(context);
return true;
},
child: Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Form(
key:_formKey,
child:Expanded(
child:Scrollbar(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
TextFormField(
controller: _phoneNumber,
validator: validateNumber, //my validator
),
],
),
),
),
),
FlatButton(
onTap: (){
if(_formKey.currentState.validate()){
addPhoneNumber(phoneNumber)
}
},
)
],
),
),
);
}
}
答案 0 :(得分:0)
您需要在表单状态上调用validate()
方法。在here中查找API参考。
此框架不会自动为您调用。您需要在按钮的onTap()
方法内调用它。在此处添加一行_formKey.currentState.validate()
。
调用此方法时,表单将为每个表单字段调用validator
。
------------------------------- UPDATE ------------------- --------------------
好吧,@ ppdy,您现在已经近了一步。尚不可行,因为您的验证程序仅检查该值是否为空。只需仔细查看按下按钮时会发生什么。它运行validateNumber
,如果该值为空,则框架将呈现您的验证消息。然后,如果该值不为空,则运行addPhoneNumber
方法,但自己运行。这很重要,请注意,它不会作为文本表单字段validator
属性函数的一部分运行。因此,您需要自己处理await db.checkPhoneNumber(phoneNumber);
的输出,如果检查为false,则在文本表单字段中呈现红色验证消息。
为此,请首先注意TextFormField
类具有decoration
属性。此属性的类型为InputDecoration
。请阅读此类here的文档。因此,通过设置装饰的errorText
属性,您将能够将红色验证消息手动添加到表单字段。
尝试全面思考,玩转,将其粘在一起,您将拥有想要的东西:)