Flutter:另一个内在的未来

时间:2019-04-10 18:50:38

标签: android ios dart flutter

在我的Flutter应用中,我有一些嵌套的Future作业可以执行。例如,我首先需要从Firebase获取当前用户的电子邮件,然后根据收到的电子邮件从数据库中提取正确的用户。

我已经在下面实现了

class LoadSellAdsUIState extends State<LoadSellAdsUI> {
  FirebaseUser firebaseUser;
  User user;
  bool startUILoad=false;


  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    Future.wait([
      FirebaseJobs.getCurrentUser().then((firebaseUserTemp) {
        if (firebaseUserTemp != null) {
          firebaseUser = firebaseUserTemp;

          DataFetch()
              .loadUser(AppNavigation.getAPIUrl() +"user/getUserByEmail/" +firebaseUser.email)
              .then((User userTemp) {

                if(user!=null)
                {
                    user = userTemp;
                    print(user.email + " : " + user.iduser.toString());
                }

              setState(() {
                startUILoad=true;
              });

          });
        }
      })
    ]);
  }
//other code here
}

我的Future是在另一个类中定义的,下面是上述Future s的代码

static final FirebaseAuth _auth = FirebaseAuth.instance;

static Future<FirebaseUser> getCurrentUser()
  {
    return _auth.currentUser();

  }

Future<User> loadUser(String url) async {
    final response = await http.get(url);

    if (response.statusCode == 200) {
      return User.fromJson(convert.json.decode(response.body));
    } else {
      throw Exception('Failed to load post');
    }
  }

请注意,我正在Future方法内使用initState

问题在于代码从不等待内部的FutureDataFetch().loadUser())),并且始终移至build方法。

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

我借助布尔值来监视Future的状态来解决此问题。代码在下面

@override
  void initState() {
    // TODO: implement initState
    super.initState();



       //IF THE USER IS NOT LOGGED IN, DIRECT THE USER TO LOGIN
      FirebaseJobs.getCurrentUser().then((firebaseUser){
        if(firebaseUser==null)
        {
          setState(() {
              startUILoad=true;
            });
        }
        else{

          firebaseUser1 = firebaseUser;
          DataFetch().loadUser(AppNavigation.getAPIUrl()+"user/getUserByEmail/"+firebaseUser.email).then((User result)
          {


            user = result;
            setState(() {
              startUILoad=true;
            });
          });
        }
      });


  }

@override
  Widget build(BuildContext context) {
    // TODO: implement build
    return startUILoad? sellAdFutureBuilder() : Center(child: CircularProgressIndicator(),);
  }