如何使用 ProxyProvider 调用异步方法?
How to call an async method using ProxyProvider?
我的一项服务 UserService
有一个异步 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(),
));
}
当然,由于类型不匹配,尝试创建 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
是我想要做的事情的更好工具吗?
在 REMI 的回答后编辑
我现在正在使用 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
)
],
调用 create
时 UserService
是 null
。
使用 ChangeNotifierProxyProvider
的 update
也不起作用 UserService
是构造函数依赖性。
您可以使用 FutureProvider
代替:
Provider<Api>(create: (_) => Api()),
FutureProvider<UserService>(
create: (context) async {
var service = UserService(Provider.of(context, listen: false));
await service.init();
return service;
},
),
您还可以这样做:
void main() async {
final service = UserService();
await service.init();
runApp(
Provider.value(
value: service,
),
);
}
我的一项服务 UserService
有一个异步 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(),
));
}
当然,由于类型不匹配,尝试创建 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
是我想要做的事情的更好工具吗?
在 REMI 的回答后编辑
我现在正在使用 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
)
],
调用 create
时 UserService
是 null
。
使用 ChangeNotifierProxyProvider
的 update
也不起作用 UserService
是构造函数依赖性。
您可以使用 FutureProvider
代替:
Provider<Api>(create: (_) => Api()),
FutureProvider<UserService>(
create: (context) async {
var service = UserService(Provider.of(context, listen: false));
await service.init();
return service;
},
),
您还可以这样做:
void main() async {
final service = UserService();
await service.init();
runApp(
Provider.value(
value: service,
),
);
}