【问题标题】:Flutter firebase validation of form field inputs表单字段输入的 Flutter firebase 验证
【发布时间】:2019-03-06 04:11:00
【问题描述】:

我是 Flutter 和 Firebase 的新手,我正在尝试验证来自表单的用户输入并针对 firebase 集合运行它。

我要求用户创建一个用户名,并希望验证我的 Firebase 目录中没有现有的用户名。

我从Check if Field Already exists in Flutter Firestore 的讨论中得到了这个验证方法。我想为该方法提供一个名称,使用该名称构建一个文档列表,并确认不存在。

  Future<bool> doesNameAlreadyExist(String name) async {
    final QuerySnapshot result = await Firestore.instance
        .collection('user')
        .where('user_id', isEqualTo: name)
        .limit(1)
        .getDocuments();
    final List<DocumentSnapshot> documents = result.documents;
    return documents.length == 1;
  }

我希望能够在文本表单字段的验证器中调用此方法,如下所示。

new TextFormField(
          decoration: new InputDecoration(labelText: 'Username'),
          validator: (value) => doesNameAlreadyExist(value) ? "Username already taken" : null,
          onSaved: (value) => _username = value,
        ),

但是,这会引发一个错误,我必须为验证器设置一个静态类型的 bool。

我的问题:我如何 (1) 创建一个能够搜索 Firebase 的静态布尔方法或 (2) 如何通过异步调用获得相同的功能(理想情况下,无需构建另一个小部件)?

【问题讨论】:

    标签: firebase dart flutter


    【解决方案1】:

    未来给出 then() 方法,可以使用 That。您可以将验证器方法修改为:

    validator: (value) => checkUserValue(value) ? "Username already taken" : null,
    
    
      bool _userExist = false;
      checkUserValue<bool>(String user) {
        _doesEmailAlreadyExist(user).then((val){
          if(val){
            print ("UserName Already Exits");
            _userExist = val;
          }
          else{
            print ("UserName is Available");
            _userExist = val;
          }
        });
        return _userExist;
      }
    

    【讨论】:

    • 感谢 Anmol 的快速响应。我保留了 Future 方法并添加了 checkUserValue 方法(将它放在 Future 构造函数的正下方)。不幸的是,它没有正确调用 Firebase 数据库(我已经对其进行了配置并从其他集合中提取数据,所以我认为这不是问题)。此外,我收到以下错误:“Dart 错误:未处理的异常:断言失败:布尔表达式不得为空”。知道为什么这可能无法正确调用 Firebase 或布尔表达式未得到评估吗?
    • 非常感谢@Anmol。它正确识别用户并正确传递。但是,验证器没有触发。知道如何让它工作吗?验证器在未来被调用时可以工作吗?
    • 我试过了,它确实被触发并显示错误-确保您在构建覆盖之外定义函数和变量。它也会在键盘提交按钮上触发。
    • 确认,两者都在构建之外。我还有一个电子邮件和密码字段,我可以在其中验证以确认这两个字段都存在。这些工作正常(不做任何数据库查找,只是确认用户输入了文本)。当我输入数据进行测试并将电子邮件留空并使用相同的用户名时,电子邮件验证器错误最初不会触发。但是,如果我再次尝试提交,它将触发。知道会发生什么吗?
    • 最好在这里使用 FormState 全局键手动触发验证器。 formkey.currentState.validate() 将触发验证器并返回真假。
    猜你喜欢
    • 2023-03-14
    • 2020-08-11
    • 2018-11-10
    • 2017-06-15
    • 1970-01-01
    • 2018-04-29
    • 2016-07-15
    • 2017-05-18
    • 2017-11-09
    相关资源
    最近更新 更多