Flutter GetIt引发实例异常

时间:2020-10-21 09:09:53

标签: flutter dart dependency-injection

我正在尝试使用get_it在flutter应用程序中注册我的服务,并且需要从一开始就通过异步调用初始化一个依赖项。 正如我在official Get_It pub page上所读到的,只要我为依赖于该可初始化类的依赖项定义dependsOn属性,就应该没有问题。

在我的示例中,DeviceInfo是需要初始化的类,GatewayWorkingTimeRepository都依赖于该类。两者都定义了自己的dependentOn属性。

void setup() {
  getIt.registerSingletonAsync<DeviceInfo>(() async => DeviceInfo.init());

  getIt.registerSingletonWithDependencies(
      () => Gateway(deviceInfo: getIt.get()),
      dependsOn: [DeviceInfo]);

  getIt.registerSingletonWithDependencies<WorkingTimeRepository>(
      () => WorkingTimeRepository(
          dio: new Dio(), httpHeader: new HttpHeader(), gateway: getIt.get()),
      dependsOn: [DeviceInfo, Gateway]);
}

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

════════小部件库捕获到异常══════════════════════════════════ ═ 构建MainView时引发以下断言: 您试图访问尚未准备就绪的WorkingTimeRepository实例 'package:get_it / get_it_impl.dart': 断言失败:第322行pos 14:“ instanceFactory.isReady”

我找不到我的错误,我还以为访问注册类型时,它可以解决所有依赖项

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

1 个答案:

答案 0 :(得分:0)

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

示例:

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);
          }
        });
  },
);
相关问题