Flutter:如何处理需要身份验证的屏幕?

时间:2017-12-13 21:49:18

标签: android ios login navigation flutter

我正在构建一个Flutter应用程序,其中某些屏幕可以显示给匿名用户,而其他屏幕则需要用户登录。

对于经过身份验证的屏幕,如果用户未登录,他们应自动导航到(推送)登录屏幕。用户会话可以随时过期,如果用户正在查看其中一个经过身份验证的屏幕,则登录屏幕应该立即显示。

在Flutter中,如何在未经过身份验证的情况下实现自动导航到登录屏幕/从登录屏幕导航的已验证屏幕的概念?

2 个答案:

答案 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;
  }
}