dart 如何使用SharedPreferences中的持久化数据在Flutter应用中初始化GoRouter?

oxf4rvwz  于 2023-07-31  发布在  Flutter
关注(0)|答案(1)|浏览(93)

我正在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中通常是如何解决的?我怀疑这是一个相当常见的情况和流行的组件。

axr492tv

axr492tv1#

main函数中:

void main() async {
  /// IMPORTANT: Call this.
  WidgetsFlutterBinding.ensureInitialized();

  /// Use preferences like expected.
  final preferences = await SharedPreferences.getInstance();

  runApp(...);
}

字符串
为什么?为什么?
ServicesBinding绑定mixin上的“instance”getter只有在绑定初始化后才可用。通常,这通过调用“WidgetsFlutterBinding.ensureInitialized()”或“runApp()”(后者调用前者)来完成。”

相关问题