【问题标题】:Problem with asynchronous behaviour in flutter and firebase combinationFlutter 和 Firebase 组合中的异步行为问题
【发布时间】:2020-11-14 16:21:08
【问题描述】:

我有一个流构建器来监听身份验证状态的变化。 当用户成功登录时,我想检查他的电子邮件地址是否为 admin@admin.de(我正在使用管理员和密码创建用户) 为此,我有一个异步函数,可以查询当前用户的 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 == 'admin@admin.de'){
                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 == 'admin@admin.de'){
                  return AdminPanelScreen();
                }
                else {
                  return StoreListScreen();
                }
              });

            }
            else{
              return AuthScreen();
            }
          }),
    );
  }
}

这是错误

【问题讨论】:

  • 不用else if,直接用else就行了
  • 有同样的结果:/
  • 但是你取消了条件,对吧? (userSnapshot.hasData == null)?它应该只是else { return AuthScreen(); }
  • 是的,但我仍然收到此错误此函数的返回类型为“AuthScreen”,但不以返回语句结束。
  • 它给出了but doesn't end with a return statement. ,因为您在第一个 if 中没有返回任何内容,使用该未来函数并检查导航位置会给您这种行为。我建议您采用您得到的第一个答案或尝试其他方法。

标签: firebase flutter authentication dart firebase-authentication


【解决方案1】:

您应该为 if(userSnapshot.hasData) 创建一个 else 部分,当 userSnapshot(用户)尚不存在时,您将在其中返回 AuthScreen。从仅看它我假设无论第一个 if 是否有数据,您总是返回 AuthScreen。

假设 userSnapshot.data 是 FirebaseUser,我会这样做:

if (userSnapshot.hasData) {
  if (userSnapshot.data.email == 'admin@admin.de'){
       return AdminPanelScreen();
     } else {
       return StoreListScreen();
     }
} else  {
return AuthScreen();     
}
            

你也使用userSnapshot.connectionStateuserSnapshot.data.connectionState 我不记得安静显示例如进度指示器

【讨论】:

  • 我可以确认您的观察我刚刚测试过。你有解决方案吗?如果我尝试你的解决方案,我会收到以下错误:此函数的返回类型为“AuthScreen”,但不以返回语句结尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2015-01-18
  • 2021-11-21
  • 2020-05-14
相关资源
最近更新 更多