从小部件内部返回未来的函数中获取价值

时间:2020-02-03 18:02:07

标签: database flutter dart future

我正在尝试在用户注册时检查数据库中是否已存在用户名。因此,我创建了一个检查数据库的函数,并希望它返回布尔值,但是随着对数据库的调用返回了将来,我将该函数设置为异步函数,以便可以等待响应。由于所有异步函数都返回一个future,所以我现在有了future,而不是布尔值。我希望能够在build函数中多次调用函数,但是得到的是Future而不是boolean,如果我尝试添加await,则必须使其异步,这意味着我需要返回Future而不是小部件。

这是小部件。 _account.isUsernameAvailable(value)是我要返回布尔值的函数,下面是我的构建函数。从我读过的其他答案中,构建未来似乎是一个受欢迎的选择,但是从我的理解中,我们需要事先知道未来的价值。就我而言,这是不可能的。任何建议或帮助将不胜感激。

  final _account = Account();

  @override
  Widget build(BuildContext context) {
    return loading ? Loading() : Scaffold(
      appBar: AppBar(
        title: Text('Sign Up'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Form(
              key: _formKey,
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 10.0),
                    child: TextFormField(
                      onSaved: (value) {
                        _username = value.trim();
                      },
                      validator: (value) {
                        if (value.isEmpty) {
                          return 'Please enter a username';
                        } else if (_account.isUsernameAvailable(value)) {
                          return 'Username already exists';
                        }
                        return null;
                      },
                      decoration: InputDecoration(
                        hintText: 'Username',
                      ),
                    ),
                  ),

这是帐户类别的代码。

  Future isUsernameAvailable(String username) async {
    QuerySnapshot docs = await userCollection
        .where('username', isEqualTo: username)
        .getDocuments();
    return docs.documents.isEmpty;
  }

更新:

如建议的那样,我在函数中尝试了一个then语句。

  bool _userExist = false;
  checkUserValue<bool>(String user) {
    _account
        .isUsernameAvailable(user).then((val){
          print(val);
      if(val){
        print ("UserName Already Exits");
        _userExist = val;
      }
      else{
        print ("UserName is Available");
        _userExist = val;
      }
    });
    print('here');
    return _userExist;
  }

我的小部件现在看起来像这样。

    child: TextFormField(
       onSaved: (value) {
          _username = value.trim();
       },
       validator: (value) {
          return checkUserValue(value) ? "Username taken" : null;
       },

它似乎可以工作,但是我需要两次验证才能起作用。我认为_userExists的值可能会在函数以某种方式返回后进行设置,但是我不太确定为什么会发生这种情况。话虽这么说,我确实有一个问题,为什么函数在.then()完成之前不返回?

0 个答案:

没有答案