我正在尝试使用get_it
在flutter应用程序中注册我的服务,并且需要从一开始就通过异步调用初始化一个依赖项。
正如我在official Get_It pub page上所读到的,只要我为依赖于该可初始化类的依赖项定义dependsOn属性,就应该没有问题。
在我的示例中,DeviceInfo
是需要初始化的类,Gateway
和WorkingTimeRepository
都依赖于该类。两者都定义了自己的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”
我找不到我的错误,我还以为访问注册类型时,它可以解决所有依赖项
有人知道这里缺少什么吗?
答案 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);
}
});
},
);