我有一个流生成器,用于侦听身份验证状态的更改。
当用户成功登录后,我想检查是否他的电子邮件地址是[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();
}
}),
);
}
}
这是错误最佳答案
您应该为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.connectionState
或userSnapshot.data.connectionState
我不记得安静显示例如进度指示器关于firebase - Flutter和Firebase组合中的异步行为问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63079698/