我有一个流生成器,用于侦听身份验证状态的更改。
当用户成功登录后,我想检查是否他的电子邮件地址是[email protected](我正在使用admin和password创建用户)
为此,我有一个异步功能,可以查询当前用户的Firebase并获取电子邮件。
然后,我将电子邮件与示例电子邮件进行了比较,但是它不起作用,实际上它始终会出现在AuthScreen()上,仅在您登录或注销时才可见。

Future<String> check_for_privilege() async {
  final FirebaseUser user = await FirebaseAuth.instance.currentUser();
  final String email = user.email.toString();
  return email;
}

class _MyHomePage extends StatelessWidget {

  Future<String> email;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: StreamBuilder(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (ctx, userSnapshot) {

            if (userSnapshot.hasData) {
              check_for_privilege().then((value) {
              if (value == '[email protected]'){
                return AdminPanelScreen();
              }
              else {
                return StoreListScreen();
            }
              });

            }
            return AuthScreen();
          }),
    );
  }
}
编辑:
正如朱利安·奥托(Julian Otto)正确指出的,无论如何都将调用AuthScreen()。但是把它放在像
Else if (userSnapshot.hasData == null) {
return AuthScreen()
} 
导致以下错误:
此函数的返回类型为'AuthScreen',但不以return语句结尾。
编辑2:
class _MyHomePage extends StatelessWidget {

  Future<String> email;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: StreamBuilder(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (ctx, userSnapshot) {

            if (userSnapshot.hasData) {
              check_for_privilege().then((value) {
                if (value == '[email protected]'){
                  return AdminPanelScreen();
                }
                else {
                  return StoreListScreen();
                }
              });

            }
            else{
              return AuthScreen();
            }
          }),
    );
  }
}
这是错误
firebase - Flutter和Firebase组合中的异步行为问题-LMLPHP

最佳答案

您应该为if(userSnapshot.hasData)创建else部分,当userSnapshot(用户)还不存在时,您将在其中返回AuthScreen。从第一眼看,我假设不管第一个if是否具有数据,您都始终返回AuthScreen。
假设userSnapshot.data是FirebaseUser,我将以这种方式进行操作:

if (userSnapshot.hasData) {
  if (userSnapshot.data.email == '[email protected]'){
       return AdminPanelScreen();
     } else {
       return StoreListScreen();
     }
} else  {
return AuthScreen();
}

另外,您使用userSnapshot.connectionStateuserSnapshot.data.connectionState我不记得安静显示例如进度指示器

关于firebase - Flutter和Firebase组合中的异步行为问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63079698/

10-10 23:55