如何在Flutter中渲染小部件之前等待异步函数完成执行

在我的main.dart文件中,我想检查用户是否已登录,以便将其定向到适当的屏幕。我正在使用SharedPrefence从Firebase存储用户详细信息。 我如何告诉我的函数等待,直到我的SharedPreference异步函数完成执行,然后才能呈现相应的小部件。

下面是我的代码

Path

}

ssd88 回答:如何在Flutter中渲染小部件之前等待异步函数完成执行

您不必等待构建,您应该构建一些东西,向用户显示应用程序正在加载东西(或黑屏),然后在功能结束时重新构建。

您可以在创建窗口小部件时将Widget变量设置为默认值,例如使用CircularProgressIndicator,然后使用setState对其进行更改,如下所示:

class YourWidgetState extends State<YourWidget> {
  Widget _body = CircularProgressIndicator();  // Default Body

  @override
  void initState(){
    _gotoHomeScreen();
  }

  @override
  Widget build(BuildContext context){
    return _body;
  }

  Widget _gotoHomeScreen() {
    AuthService.getuserPrefEmail().then((email){
      AuthService.email = email;
      if (email == null) {
        setState(() => _body = LoginScreen());
      } else {
        AuthService.uid = email;
        setState(() => _body = HomeMenuScreen());
      }
    });
  }
}

另一种方法是使用变量来通知您有关加载情况,例如bool finishedLoading,并使用完成后调用setState来更改值。 email变量,您设置为知道用户何时登录并进行条件构建,例如:

bool loading = true;

@override
Widget build(BuildContext context){
  if(loading) return CircularProgressIndicator();

  if(AuthService.email == null)
    return LoginScreen();
  else
    return HomeMenuScreen();
}

Widget _gotoHomeScreen() {
  AuthService.getuserPrefEmail().then((email){
    AuthService.email = email;
    if (email != null) {
     AuthService.uid = email;
    }
    setState((){ loading = false; });
  });
}
,

使用一个简单的FutureBuilder!

https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

FutureBuilder<Email>(
future: AuthService.getuserPrefEmail(),builder: (BuildContext context,AsyncSnapshot<String> snapshot) {
  switch (snapshot.connectionState) {
    case ConnectionState.active:
    case ConnectionState.waiting:
     return CircularProgressIndicator();
    case ConnectionState.done:
     if (snapshot.hasError) {
       return Text('Error: ${snapshot.error}');
      }
     .... here route to your screen or set it how you want
  }
 },)
本文链接:https://www.f2er.com/3152857.html

大家都在问