Как вызвать метод asyn c с помощью ProxyProvider? - PullRequest
1 голос
/ 25 февраля 2020

Одна из моих служб, 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 является зависимостью конструктора.

1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете использовать 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,
    ),
  );
}
...