Одна из моих служб, UserService
, имеет асинхронный метод c init
(так как он вызывает Hive.openBox
).
Мне нужна эта инициализация для завершения, чтобы внедрить эту зависимость в ChatService
.
main() {
runApp(MultiProvider(
providers: [
Provider<Api>.value(value: Api()),
ProxyProvider<Api, UserService>(update: (_, api, __) async {
var service = UserService(api);
await service.init();
return service;
}),
ChangeNotifierProxyProvider<UserService, ChatService>(
create: (_) => ChatService(),
update: (_, userService, chatService) => chatService..userService = userService
),
],
child: MyApp(),
));
}
Конечно, попытка сделать create async
приводит к следующей ошибке из-за несоответствия типов:
The argument type 'Future<UserService> Function(BuildContext, Api, UserService)' can't be assigned to the parameter type 'UserService Function(BuildContext, Api, UserService)'.dart(argument_type_not_assignable)
Как мне ждать этого метода с помощью ProxyProvider
?
Является ли get_it
лучшим инструментом для того, что я пытаюсь сделать?
РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТА РЕМИ
I'm используя FutureProvider
сейчас, но все еще неясно, как передать инициализированную зависимость UserService
в следующую зависимость ChatService
, когда она неизменна:
providers: [
Provider<Api>(create: (_) => Api()),
FutureProvider<UserService>(
lazy: false,
create: (context) async {
var service = UserService(Provider.of(context, listen: false));
await service.init();
return service;
}
),
ChangeNotifierProvider<ChatService>(
create: (context) => ChatService(Provider.of<UserService>(context, listen: false)), // UserService is null
)
],
UserService
равно null
к тому времени create
вызывается.
Использование ChangeNotifierProxyProvider
update
, которое тоже не сработает UserService
является зависимостью конструктора.