Flutter - onGenerateRoute 与 Await for auth Guard

use*_*745 5 authentication routes flutter

我有一个包含多个页面的 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,
    ),
  );
}
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*kin 5

正如你所看到的onGenerateRoute必须返回Route,所以它必须是同步的并且不能使用await.

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

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

main如果 future 实际上相当快(从共享首选项或本地数据库读取),那么您可以尝试在函数中等待未来结果runApp