我有一个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;
}
}
}
答案 0 :(得分:1)
如您所见,onGenerateRoute
必须返回Route
,因此它必须是同步的并且不能使用await
。
我认为,针对所提供情况的最简单解决方案是为仪表板创建一个代理页面,该页面将由FutureBuilder
组成,您可以在其中显示一些进度指示器,以进行将来的处理,并在获得结果时进行更新。 / p>
另一种选择是再次使用FutureBuilder
,但要使用整个MaterialApp类。
如果将来实际上非常快(从共享的首选项或本地数据库中读取),则可以尝试在main
之前在runApp
函数中等待将来的结果
答案 1 :(得分:0)
最简单的解决方案是在runApp之前在主函数中运行auth检查。该应用程序将在此调用期间显示本机启动屏幕(默认情况下为白屏,但可以更改)。