我正在构建一个Flutter应用程序,其中某些屏幕可以显示给匿名用户,而其他屏幕则需要用户登录。
对于经过身份验证的屏幕,如果用户未登录,他们应自动导航到(推送)登录屏幕。用户会话可以随时过期,如果用户正在查看其中一个经过身份验证的屏幕,则登录屏幕应该立即显示。
在Flutter中,如何在未经过身份验证的情况下实现自动导航到登录屏幕/从登录屏幕导航的已验证屏幕的概念?
答案 0 :(得分:2)
目前,对于Authentification和Authentified路线没有任何影响。 问题是dart:mirror被禁用,这阻止了更自动化的解决方案。
您可以尝试:
MaterialApp
' routes
属性MaterialApp
' onGenerateRoute
属性并确保在onGenerateRoute
内记录用户。如果是的话,建立那条路线。如果没有,请构建Login
路由,并将原始目标作为参数传递(以便稍后重定向到该页面)
代码生成器也可能是一个很好的解决方案;虽然比较复杂。
答案 1 :(得分:0)
有一个非常好的 Flutter 包 auto_route
。
它为您提供了为 Route Guards
路由实现 Authenticated
的强大功能。
我鼓励您使用最新版本的库(这次我正在编写答案https://pub.dev/packages/auto_route/versions/1.0.0-beta.8 是最新版本)
该文档具有误导性,但 https://github.com/Milad-Akarie 正在积极开发该库,并在 GitHub 上的 Issues
标签下回答任何问题。
有一个示例解决方案:https://github.com/Milad-Akarie/auto_route_library/tree/master/example
AppRouter.dart
...
AutoRoute(path: RoomPage.path, guards: [AuthGuard],page: RoomPage),
...
AuthGuard.dart
class AuthGuard extends AutoRouteGuard {
@override
Future<bool> canNavigate(
List<PageRouteInfo> pendingRoutes, StackRouter router) async {
bool isAuthenticated = await checkUserAccess();
if (!isAuthenticated) {
router.root.push(LoginRoute(onLoginResult: (success) {
if (success) {
router.replaceAll(pendingRoutes);
}
}));
return false;
}
return true;
}
}