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

Database 从小部件中返回未来的函数获取值,database,flutter,dart,future,Database,Flutter,Dart,Future,我试图在用户注册时检查我的数据库中是否已经存在用户名。所以我做了一个函数来检查数据库,我想让它返回一个布尔值,但是当对数据库的调用返回未来时,我把这个函数变成了一个异步函数,这样我就可以等待响应了。因为所有异步函数都返回一个未来,所以我现在有了一个未来,而不是布尔值。我希望能够在我的构建函数中多次调用我的函数,但是我得到了一个future而不是boolean,如果我尝试添加wait,我必须使它异步,这意味着我需要返回future而不是widget 这是小部件\u account.isUserna

我试图在用户注册时检查我的数据库中是否已经存在用户名。所以我做了一个函数来检查数据库,我想让它返回一个布尔值,但是当对数据库的调用返回未来时,我把这个函数变成了一个异步函数,这样我就可以等待响应了。因为所有异步函数都返回一个未来,所以我现在有了一个未来,而不是布尔值。我希望能够在我的构建函数中多次调用我的函数,但是我得到了一个future而不是boolean,如果我尝试添加wait,我必须使它异步,这意味着我需要返回future而不是widget

这是小部件<代码>\u 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',
                      ),
                    ),
                  ),
更新:

正如建议的那样,我在函数中尝试了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;
  }

它似乎工作,但我需要验证两次它的工作。我认为
\u userExists
的值可能是在函数以某种方式返回后设置的,但我不确定为什么会发生这种行为。也就是说,我确实有一个问题,为什么函数不在.then()完成之前返回

如果你真的想得到一个好的答案,你可能想发布
帐户
类的代码。请参阅你是否尝试过将来的isUsernameAvailable(String username)async{}?然后,您应该能够在代码的其余部分使用函数的“wait”变体。通过将Future指定为返回类型,如果您等待的话,它将在将来返回bool。它在第一次输入名称时起作用,但无法从此处更新。函数本身可以工作,但我认为它会在完成之前返回。
  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;
       },