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!
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:
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!