Как построить архитектуру флаттер-приложения

Я реализую приложение на основе чата во Flutter. Я думал об использовании пакета Provider для создания двух основных уведомителей: UserService и ChatService. Первый обрабатывает вход в систему (и все остальные функции, связанные с пользователем), а второй - специальные функции чата. Однако chatService требуется доступ к UserService для некоторых функций. Я попытался использовать ProxyProvider, и это код:

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<UserService>(builder: (_) => UserService.instance()),
        ChangeNotifierProxyProvider<UserService, ChatService>(builder: (_, user, chatService) => ChatService.init(user))
      ],
      child: MaterialApp(
          ...
      ),
    );
  }
}

Однако, когда я запускаю приложение, flutter выдает эту ошибку:

Пытался использовать Provider с подтипом Listenable / Stream (ChatService).

Вероятно, это ошибка, поскольку поставщик не будет автоматически обновлять иждивенцев при обновлении ChatService. Вместо этого рассмотрите возможность изменения Provider для более конкретной реализации, которая обрабатывает механизм обновления, например:

  • ListenableProvider
  • ChangeNotifierProvider
  • ValueListenableProvider

Спасибо!


person Michele Papale    schedule 19.12.2019    source источник
comment
Я снова запускаю эмулятор и вот, как ни странно, он работает.   -  person Michele Papale    schedule 20.12.2019


Ответы (1)


Неясно, какую «архитектуру» вы собираетесь использовать. Provider - это просто механизм для безопасного получения объектов в дереве виджетов.

Предполагая, что вы имеете в виду UserService и ChatService, а это ChangeNotifiers (может быть BLoC или что-то еще) - вот пример того, как вы подключите их к Provider:

main() {
  runApp(MultiProvider(
    providers: [
        ChangeNotifierProvider<UserService>(create: (_) => UserService()),
        ChangeNotifierProxyProvider<UserService, ChatService>(
          create: (_) => ChatService(),
          update: (_, userService, chatService) => chatService..userService= userService
        ),
      ],
      child: MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<ChatService>(
      builder: (context, chatService, _) => Text(chatService.currentUser.lastMessage) // or whatever you need to do
    );
  }
}
person Frank Treacy    schedule 19.12.2019
comment
с архитектурой я имею в виду, какие компоненты создавать (в вашем случае уведомители) и сколько из них (один уведомитель, чтобы избежать моей проблемы, против двух уведомителей, как в вашем случае). Спасибо за ваш ответ! - person Michele Papale; 20.12.2019
comment
У меня была такая же ошибка, но теперь я вижу свою ошибку, я использовал ProxyProvider вместо ChangeNotifierProxyProvider. Спасибо!!! - person Piyey; 13.05.2020