Как передать данные от одной модели провайдера к другой? - PullRequest
1 голос
/ 27 июня 2019

Я хочу использовать provider (ChangeNotifierProvider) и ChangeNotifier для управления состоянием приложения. Но как я могу получить доступ к состоянию из одной модели в другой модели?

Вариант использования: в приложении чата одна модель для хранения пользовательской информации. Другая модель использует информацию о пользователе (например, идентификатор пользователя) для вызова базы данных (Firestore) и получения потока данных чата.

Например:

class Model1 extends ChangeNotifier {
  final List<Item> items = [];

class Model2 extends ChangeNotifier {
//Access items from Model1 here
items;

Возможно ли это? Мне не нравится иметь очень большую модель, потому что ее трудно поддерживать.

Спасибо!

1 Ответ

0 голосов
/ 27 июня 2019

При использовании provider одна модель не имеет доступа к другой модели.

Вместо этого следует использовать ProxyProvider, чтобы объединить модель из других.

Ваши модели будут выглядеть так:

class Foo with ChangeNotifier {
  int count = 0;

  void increment() {
    count++;
    notifyListeners();
  }
}

class Bar with ChangeNotifier {
  int _count;
  int get count => _count;
  set count(int value) {
    if (value != count) {
      _count = value;
      notifyListeners();
    }
  }
}

И тогда вы можете использовать ChangeNotifierProxyProvider таким образом (при условии, что в вашем дереве виджетов есть `ChangeNotifierProvider выше):

ChangeNotifierProxyProvider<Foo, Bar>(
  initialBuilder: (_) => Bar(),
  builder: (_, foo, bar) => bar
    ..count = foo.count, // Don't pass `Foo` directly but `foo.count` instead
)
...