【发布时间】: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