web-dev-qa-db-fra.com

Comment transmettre des données d'un modèle de fournisseur à un autre?

Je veux utiliser provider (ChangeNotifierProvider) et ChangeNotifier pour gérer l'état de l'application. Mais comment puis-je accéder à l'état d'un modèle dans un autre modèle?

Utilisation Case: Dans l'application de discussion, un modèle pour les informations de magasin Store. Autre modèle Utilisez des informations utilisateur (par exemple, ID utilisateur) pour apporter appel à la base de données (Firestore) et obtenir le flux de données de discussion.

Par exemple:

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

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

Est-ce possible? Je n'aime pas avoir un très gros modèle car il est difficile de maintenir.

Merci!

7
FlutterFirebase

De - v4 le ChangeNotifierProxyProvider Le fournisseur peut être construit comme suit:

ChangeNotifierProxyProvider<Foo, Bar>(
  create: (_) => Bar(),
  update: (_, foo, bar) => bar
    ..count = foo.count,
)

Remarquerez que initialBuilder: a changé en create: et builder: à update:

0
Iain Smith

J'essaie de mettre en œuvre le même scénario, voici mon code: Fichier principal:

        ChangeNotifierProvider<SharedPreferencesData>(
      create: (context) => SharedPreferencesData(),
    ),
    ChangeNotifierProxyProvider<SharedPreferencesData, DatabaseService>(
      create: (_) => DatabaseService(),
      update: (_, sharedPreferencesData, databaseService) {
        print('ChangeNotifierProxyProvider RAN');
        databaseService..setSpCompanyId = sharedPreferencesData.sPCompanyId;
        return null;
      },
    ),

SharedPreferencesData File:

    class SharedPreferencesData with ChangeNotifier {
    String sPCompanyId = '';
    void setCompanyId(String cpID) {
     sPCompanyId = cpID;
     print('setCompanyId sPCompanyId:$sPCompanyId');
     notifyListeners();
    }
  }

Fichier de Bases de données:

class DatabaseService with ChangeNotifier {
  String sPCompanyId = 'empty';
  String get getSpCompanyId => sPCompanyId;

  set setSpCompanyId(String value) {
    print('value in setter database before if: $value');
    if (value != getSpCompanyId) {
      print('value in setter database: $value');
      sPCompanyId = value;
      notifyListeners();
    }
  }

La classe BasesVice ne met pas à jour. J'ai ajouté les impressions pour déterminer ce qui est en marche et ce qui n'est pas. Lorsque j'exécute mon code, les impressions de la méthode Shared_Prreferences/SetCompanyID fonctionnent correctement. Pourtant, la fonction d'impression dans le fichier MAIN.DART est imprimée ('ChangenotifierProxyProxyProvider Ran'); Et dans Datab BaseService File Print ('Valeur dans la base de données Setter: $ valeur'); ne fonctionne pas.

Qu'est-ce que je rate? Pourquoi NOTIFY SPCOMPANYID Setter NotifyListeners () dans SharedPreferencesData ne met pas à jour la mise à jour des Baserservice String SPCompanyId via ChangenotifierProxyProvider? Merci!

0
YaGeorge