【发布时间】:2020-10-23 10:51:04
【问题描述】:
我的 Flutter 应用包含几个屏幕,例如设置、添加产品、详细信息页面。
如果用户在设置页面并单击注销,即“FirebaseAuth.instance.signOut( );" ,应用程序停留在相同的设置页面上,并且不会重定向到我们在主页中使用的流构建器中提到的登录页面,如下所示。
MaterialApp(
home: StreamBuilder(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (ctx, snapSot) {
if (snapSot.hasData) {
return HomePage();
} else
return LoginScreen();
},
),),)
包版本:
- 提供者:^4.1.2
- firebase_auth:^0.16.1
我的期望:
用户在哪个页面,如果他退出,他必须被带到登录屏幕。正如我正在使用 Streambuilder 和我已将流源提供为 onAuthStateChanged。
工作场景:
但是当用户在主页屏幕中单击注销时,它会按预期工作并且用户被带到登录页面。
不工作场景:
如果用户在任何其他页面中,它不会重定向到登录页面。单击退出时,我可以在控制台中看到以下日志。
场景:用户导航:登录->主页->应用抽屉->设置页面->注销
I/flutter ( 6186): HomePage
I/flutter ( 6186): appDrawer
I/flutter ( 6186): Settings
I/flutter ( 6186): appDrawer
I/flutter ( 6186): logoutDialog
D/FirebaseAuth( 6186): Notifying id token listeners about a sign-out event.
D/FirebaseAuth( 6186): Notifying auth state listeners about a sign-out event.
尝试使用 Stream 解决方法:
主应用文件:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<UserAccount>.value(
value: Authservice().user,
child: MaterialApp(
home: Wrapper(),
onGenerateRoute: CustomRouter.generateRoute,
initialRoute: homeRoute,
),
);
}
}
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<UserAccount>(context);
print("user: $user");
if (user == null)
return LoginScreen();
else
return Dashboard();
}
}
验证服务文件:
Stream<UserAccount> get user {
return _auth.onAuthStateChanged.map(_userFBAccount);
}
UserAccount _userFBAccount(FirebaseUser user) {
return user != null
? UserAccount(
uid: user.uid,
)
: null;
}
Future<void> logout() async {
try {
print("logout");
await _auth.signOut();
} catch (error) {
print("logout $error");
}
}
警报对话按钮代码
FlatButton(
onPressed: () async {
Navigator.of(ctx).pop(); // to pop put the alert Dialogue
await _authservice.logout().then((value) {
if (Navigator.canPop(ctx)) Navigator.of(ctx).pop();
});
},
child: const Text("Yes"),
shape: Border(
right: BorderSide(color: Colors.grey),
),
),
我在这里遗漏了一些逻辑还是 Firebase_auth 插件 onAuthStateChanged 的问题?
谢谢
【问题讨论】:
-
我不久前解决了一个类似的问题。见here
-
@Nolence 谢谢你会试试看。
-
@Nolence ,能够通过您在给定链接中提到的方法解决我的问题,非常感谢。有没有一种方法可以通过使用 Main-app 的服务使用全局导航键来解决这个问题,直到它的所有路线导航?这样当用户退出时,它会从应用程序内的任何页面转到 Auth 页面
-
我不确定,因为我没有尝试过,但如果您找到其他解决方案,请随时告诉我。必须添加 willPopScope 小部件一直困扰着我,我不怀疑有一个更清洁的解决方案。
-
这些问题解决了吗?
标签: flutter firebase-authentication