Firebase 如何等待异步函数完成执行,然后在flift中呈现小部件

Firebase 如何等待异步函数完成执行,然后在flift中呈现小部件,firebase,flutter,dart,async-await,Firebase,Flutter,Dart,Async Await,在main.dart文件中,我想检查用户是否已登录,以便将其引导到相应的屏幕。我正在使用SharedReference存储Firebase中的用户详细信息。 我如何告诉我的函数等到SharedReference异步函数完成执行后才能呈现适当的小部件 下面是我的代码 Widget _gotoHomeScreen() { AuthService.getuserPrefEmail().then((email) { print(email); AuthService.email = em

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

下面是我的代码

  Widget _gotoHomeScreen() {
  AuthService.getuserPrefEmail().then((email) {
  print(email);
  AuthService.email = email;
  if (email == null) {
    return LoginScreen();
  } else {
    AuthService.uid = email;
    return HomeMenuScreen();
  }
});

}

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

您可以在创建小部件时将小部件变量设置为默认值,例如使用
循环ProgressIndicator
,然后使用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 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

FutureBuilder(
future:AuthService.getuserPrefEmail(),
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态.active:
案例连接状态。正在等待:
返回循环ProgressIndicator();
案例连接状态。完成:
if(snapshot.hasError){
返回文本('Error:${snapshot.Error}');
}
..在这里发送到您的屏幕或按您的意愿进行设置
}
},
)

谢谢@george你救了我一天我觉得这个答案更好地概括了这个问题。
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
  }
 },
)