Flutter 使用 FirebaseFirestore 中的 StreamBuilder 验证 TextFormField

问题描述 投票:0回答:1

我正在尝试验证 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;
                   },
               ),
            );
        })
flutter google-cloud-firestore
1个回答
0
投票

这种方法行不通,因为当 email.text 的值发生变化时,快照不会更新。您需要在代码的验证部分请求快照,或者更常见的是在用户提交电子邮件后请求快照(以防止查询输入的每个字符)。另外,我相信如果快照为空,

snapshot.hasData
也是正确的,这可以解释为什么它总是说电子邮件存在。您必须测试快照是否为空,而不是测试它是否有数据 - 但根据上述更改不会解决您的问题,因为您的架构不正确。

© www.soinside.com 2019 - 2024. All rights reserved.