我正在尝试验证 TextFormField,我在其中从 Firestore 集合中流式传输数据。验证是 **如果字段“电子邮件”等于 TextEditingController email.text,则应返回“电子邮件已存在。”。但即使电子邮件不存在,它也总是返回此结果。
StreamBuilder(stream: FirebaseFirestore.instance
.collection(widget.userCollection)
.where("Email", isEqualTo: email.text) //I even tried "Email", isNotEqualTo: email.text
.snapshots(),
builder: (context, snapshot) {
return Padding(
padding: EdgeInsets.only(
top: 30),
child: AppTextfield.textFormField(
onChanged: (value) {
globalKey.currentState?.validate();
},
validation: (value) {
if (snapshot.hasData) {
return widget.emailExist;
}
if (value!.isEmpty) {
return (widget.emailRequired);
} else if (!RegExp(r'\S+@\S+\.\S+').hasMatch(value)) {
return widget.enterValidEmail;
}
return null;
},
),
);
})
这种方法行不通,因为当 email.text 的值发生变化时,快照不会更新。您需要在代码的验证部分请求快照,或者更常见的是在用户提交电子邮件后请求快照(以防止查询输入的每个字符)。另外,我相信如果快照为空,
snapshot.hasData
也是正确的,这可以解释为什么它总是说电子邮件存在。您必须测试快照是否为空,而不是测试它是否有数据 - 但根据上述更改不会解决您的问题,因为您的架构不正确。