【问题标题】:Flutter GetIt throws instance exceptionFlutter GetIt 抛出实例异常
【发布时间】:2021-02-04 04:13:50
【问题描述】:

我正在尝试使用 get_it 在我的颤振应用程序中注册我的服务,并且需要在开始时使用异步调用初始化一个依赖项。 正如我在official Get_It pub page 上所读到的,这应该不是问题,只要我为依赖于该可初始化类的依赖项定义dependOn 属性即可。

在我的例子中,DeviceInfo 是需要初始化的类,GatewayWorkingTimeRepository 都依赖于这个类。两者都定义了它们的dependOn 属性。

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 实例 '包:get_it/get_it_impl.dart': 断言失败:第 322 行第 14 行:'instanceFactory.isReady'

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

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

【问题讨论】:

  • 您的 DeviceInfo 注册是异步的,当您的第一个小部件想要访问它时,它可能尚未注册。
  • 是的,看起来,bit get_it 提供了一个名为 dependsOn 的参数,您可以在其中定义将首先解决的异步依​​赖项。我还按照文档中的描述实现了它,但没有成功

标签: flutter dart dependency-injection


【解决方案1】:

当使用异步依赖时,你需要等到所有依赖都创建完成后才能启动你的应用。一种方法是使用监听 getIt.allReady() 的 FutureBuilder 向 MaterialApp 添加一个 TransitionBuilder。

例子:

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);
          }
        });
  },
);

【讨论】:

  • 我想知道如何在单元测试中实现这一点。
  • 好吧,我认为在单元测试中做到这一点的一种方法是在 setUpAll async body 中调用 getIt.allReady()
猜你喜欢
  • 2012-09-12
  • 2013-02-17
  • 2014-12-26
  • 2019-03-23
  • 2021-04-22
  • 2021-05-26
  • 2023-03-10
  • 2019-07-25
  • 2018-09-07
相关资源
最近更新 更多