我正在Flutter中重建现有的应用程序。在第一次启动时有一个引导屏幕序列,一旦引导完成,在后续应用程序启动时会跳过该序列。没什么特别的
我也在尝试使用GoRouter进行导航。我的想法是使用其构造函数的initialLocation
参数来实现上述要求,如下所示:
class MyApp extends StatelessWidget {
…
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerConfig: GoRouter(
…
initialLocation: expectedCurrentPath,
),
…
);
}
}
字符串
根据我从SharedPreferences示例中读取的bool字段的值,expectedCurrentPath
被有条件地分配了两个可能路径中的一个。一旦用户通过了最后一个引导屏幕,我就在该字段中写入true
。因此,理想情况下,当应用程序下次启动时,该条件的计算结果为true,第二条路径被分配给expectedCurrentPath
。
然而,有一个巨大的问题我似乎无法解决。SharedPreferences示例只能异步获取。我需要await
才能读取值。但是这个build
方法不是异步的,我似乎不能很容易地使它成为一个-它必须返回一个Widget
,而不是一个Future<Widget>
。因此,在上面的代码中,不允许使用await
。
我还尝试了main()
函数async
,并像这样执行await
步骤:
Future<void> main() async {
// this is a global model-like object to work with my items in SharedPreferences;
// an instance of SharedPreferences is created inside that async initialize()
await myState.initialize();
runApp(const MyApp());
}
型
但这根本不起作用:SharedPreferences已经期望应用存在,以便它访问存储。当在这个位置初始化时,它抛出异常。
总的来说,冲突是这样的:为了初始化应用程序,我需要一个路由器的解析初始位置;为了解决这个问题,我需要获取SharedPreferences的示例;为了获得该示例,应用程序必须已经被初始化。
这在Flutter中通常是如何解决的?我怀疑这是一个相当常见的情况和流行的组件。
1条答案
按热度按时间axr492tv1#
在
main
函数中:字符串
为什么?为什么?
ServicesBinding绑定mixin上的“instance”getter只有在绑定初始化后才可用。通常,这通过调用“WidgetsFlutterBinding.ensureInitialized()”或“runApp()”(后者调用前者)来完成。”