Flutter-带有auth Guard

时间:2019-08-05 10:55:11

标签: authentication flutter routes

我有一个Flutter应用,其中包含多个页面,有些页面需要用户登录才能访问该页面。

我遇到的主要问题是,对于我的kDashboardRoute,我需要调用async方法来检查用户是否登录并相应地设置bool isUserLoggedIn,但是,我无法调用此方法,因为它会返回未来,并且我不能使用await,因为routes方法无法返回未来。

有什么建议吗?

下面是我的main.dart类中的代码

Future<void> main() async {
  // run the app
  runApp(
    MaterialApp(
      title: kAppName,
      theme: ThemeData(
        primarySwatch: Colors.green,
        primaryColor: kPrimaryColour,
      ),
      onGenerateRoute: RouteGenerator.routes,
    ),
  );
}

下面是我的路线文件中的代码

import 'package:flutter/material.dart';
import 'package:myapp/services/auth_service.dart';
import 'package:myapp/utilities/constants.dart';
import 'package:myapp/pages/login_page.dart';
import 'package:myapp/pages/two_step_verification.dart';
import 'package:myapp/pages/dashboard_page.dart';
import 'package:myapp/pages/error_page.dart';

class RouteGenerator {
  static Route<dynamic> routes(RouteSettings settings) {
    final args = settings.arguments;

    switch (settings.name) {
      case kLoginRoute:
        return MaterialPageRoute(builder: (_) => LoginPage());
      case kTwoStepAuthRoute:
        return MaterialPageRoute(builder: (_) => TwoStepVerification());
      case kDashboardRoute:
        // TODO: call my auth check method here which required await
        bool isUserLoggedIn = true;  // set this accordingly 
        if (isUserLoggedIn == true) {
          return MaterialPageRoute(builder: (_) => DashboardPage());
        }

        return MaterialPageRoute(builder: (_) => ErrorPage());
      default:
        return MaterialPageRoute(builder: (_) => LoginPage());
        break;
    }
  }
}

2 个答案:

答案 0 :(得分:1)

如您所见,onGenerateRoute必须返回Route,因此它必须是同步的并且不能使用await

我认为,针对所提供情况的最简单解决方案是为仪表板创建一个代理页面,该页面将由FutureBuilder组成,您可以在其中显示一些进度指示器,以进行将来的处理,并在获得结果时进行更新。 / p>

另一种选择是再次使用FutureBuilder,但要使用整个MaterialApp类。

如果将来实际上非常快(从共享的首选项或本地数据库中读取),则可以尝试在main之前在runApp函数中等待将来的结果

答案 1 :(得分:0)

最简单的解决方案是在runApp之前在主函数中运行auth检查。该应用程序将在此调用期间显示本机启动屏幕(默认情况下为白屏,但可以更改)。