Dan*_*tin 4 dependency-injection dart flutter
我正在尝试使用以下方法在我的 flutter 应用程序中注册我的服务get_it
,并且需要在开始时使用异步调用初始化一个依赖项。 \n正如我在官方 Get_It pub 页面上所读到的那样,这应该不是问题,只要我正在为依赖项定义 dependentOn 属性,该属性依赖于该可初始化类。
在我的示例中,DeviceInfo
是需要初始化的类,并且Gateway
两者WorkingTimeRepository
都依赖于该类。两者都定义了它们的 dependentOn 属性。
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\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小智 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)
归档时间: |
|
查看次数: |
4566 次 |
最近记录: |