Je souhaite créer une application disposant d'un authentication service
avec différentes autorisations et fonctions (par exemple, des messages) en fonction du rôle de l'utilisateur.
J'ai donc créé un Provider
pour la gestion des utilisateurs et des connexions et un autre pour les messages que l'utilisateur peut voir.
Maintenant, je veux récupérer les messages (une fois) lorsque l'utilisateur se connecte. Dans Widgets
, je peux accéder au Provider via Provider.of<T>(context)
et je suppose que c'est une sorte de Singleton
. Mais comment puis-je y accéder depuis une autre classe (dans ce cas un autre fournisseur)?
4 Réponses :
C'est simple: le premier Provider fournit une instance d'une classe, par exemple: LoginManager
. L'autre fournit MessageFetcher
. Dans MessageFetcher
, quelle que soit la méthode que vous avez, ajoutez simplement le paramètre Context
et appelez-le en fournissant un nouveau contexte.
Peut-être que votre code pourrait ressembler à ceci:
class MessageFetcher { Future<String> fetchMessage(BuildContext context) { LoginManager loginManager = Provider.of<ValueNotifier<LoginManager>>(context).value; loginManager.ensureLoggedIn(); ///... } }
Et dans MessageFetcher
vous pouvez avoir:
MessageFetcher messageFetcher = Provider.of<ValueNotifier<MessageFetcher>>(context).value; String message = await messageFetcher.fetchMessage(context);
Merci pour votre réponse. Je veux dire, quand je l'ai résolu avec une autre solution: dans le fichier main.dart, j'utilise maintenant ChangeNotifierProxyProvider
au lieu de ChangeNotifierProvider
pour le fournisseur de dépendance:
class Messages extends ChangeNotifier { final Auth _authProvider; List<Message> _messages = []; List<Message> get messages => _messages; Messages(this._authProvider) { if (this._authProvider != null) { if (_authProvider.loggedIn) fetchMessages(); } } ... }
Maintenant, le fournisseur de messages sera reconstruit lorsque l'état de connexion change et obtient passé le fournisseur d'authentification:
// main.dart return MultiProvider( providers: [ ChangeNotifierProvider(builder: (_) => Auth()), ChangeNotifierProxyProvider<Auth, Messages>( builder: (context, auth, previousMessages) => Messages(auth), initialBuilder: (BuildContext context) => Messages(null), ), ], child: MaterialApp( ... ), );
En plus de cela, voici un article qui explique tous les Provider
- medium.com/flutter-community / ...
À partir de la version> = 4.0.0 , nous devons le faire un peu différemment de ce que @updatestage a répondu.
return MultiProvider( providers: [ ChangeNotifierProvider(builder: (_) => Auth()), ChangeNotifierProxyProvider<Auth, Messages>( update: (context, auth, previousMessages) => Messages(auth), create: (BuildContext context) => Messages(null), ), ], child: MaterialApp( ... ), );
Il semble que ce serait beaucoup plus facile avec Riverpod, en particulier l'idée de passer un paramètre dans un constructeur .family
pour utiliser la classe provider comme un emporte-pièce pour de nombreuses versions différentes.