Flutter GetIt 抛出实例异常

Dan*_*tin 4 dependency-injection dart flutter

我正在尝试使用以下方法在我的 flutter 应用程序中注册我的服务get_it,并且需要在开始时使用异步调用初始化一个依赖项。 \n正如我在官方 Get_It pub 页面上所读到的那样,这应该不是问题,只要我正在为依赖项定义 dependentOn 属性,该属性依赖于该可初始化类。

\n

在我的示例中,DeviceInfo是需要初始化的类,并且Gateway两者WorkingTimeRepository都依赖于该类。两者都定义了它们的 dependentOn 属性。

\n
void setup() {\n  getIt.registerSingletonAsync<DeviceInfo>(() async => DeviceInfo.init());\n\n  getIt.registerSingletonWithDependencies(\n      () => Gateway(deviceInfo: getIt.get()),\n      dependsOn: [DeviceInfo]);\n\n  getIt.registerSingletonWithDependencies<WorkingTimeRepository>(\n      () => WorkingTimeRepository(\n          dio: new Dio(), httpHeader: new HttpHeader(), gateway: getIt.get()),\n      dependsOn: [DeviceInfo, Gateway]);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在,当我的应用程序启动并且我的第一个 Widget 想要访问workingTimeRepository 时,我立即得到一个异常:

\n
\n

\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 捕获异常通过小部件库 \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\ x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\ xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\ x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\ x90\xe2\x95\x90\xe2\x95\x90\n构建 MainView 时抛出以下断言:\n您尝试访问尚未准备就绪的 WorkTimeRepository 实例\n\'package:get_it/get_it_impl.dart\': \n断言失败:第 322 行第 14 行:\'instanceFactory.isReady\'

\n
\n

我找不到我犯的错误,而且我认为在访问注册类型时,它会解决所有依赖项

\n

有人知道这里缺少什么吗?

\n

小智 6

使用异步依赖项时,您需要等到所有依赖项创建完毕后才能启动应用程序。实现此目的的一种方法是向 MaterialApp 添加一个 TransitionBuilder,并使用一个侦听 getIt.allReady() 的 FutureBuilder。

例子:

return MaterialApp(
  builder: (context, widget) {
    return FutureBuilder(
        future: getIt.allReady(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData) {
            return widget;
          } else {
            return Container(color: Colors.white);
          }
        });
  },
);
Run Code Online (Sandbox Code Playgroud)