我将电话号码存储在Firebase文档(表)中。我想要的是通过使用验证器来检测号码是否已经存在,并在文本框下显示一条消息,说明该电话号码已经存在,我对此没有任何问题,我的问题是必须双击该按钮来执行以完成该操作。任务。
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)
}
},
)
],
),
),
);
}
}
最佳答案
您需要在表单状态上调用validate()
方法。查找here以获取API引用。
框架不会自动为您调用。您需要在按钮的onTap()
方法内调用它。在其中添加_formKey.currentState.validate()
行。
调用此方法时,表单将为每个表单字段调用validator
。
---------------------------更新---------------------- -----------------
好吧,@ ppdy,您现在就更近了。尚不可行,因为您的验证程序仅检查该值是否为空。只需仔细查看按下按钮时会发生什么。它运行validateNumber
,如果该值为空,则框架将呈现您的验证消息。然后,如果该值不为空,则运行addPhoneNumber
方法,但您自己运行它。这很重要,请注意,它不会作为文本表单字段validator
属性函数的一部分运行。因此,您需要自行处理await db.checkPhoneNumber(phoneNumber);
的输出,如果检查为false,则在文本表单字段中呈现红色验证消息。
为此,请首先注意TextFormField
类具有decoration
属性。此属性的类型是InputDecoration
。请阅读此类here的文档。因此,通过设置装饰的errorText
属性,您将能够手动将红色验证消息添加到表单字段。
试着想一想,玩一玩,将其粘在一起,您将拥有想要的东西:)
关于android - Flutter验证器仅在双击时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63013644/