8
votes

Comment utiliser un fournisseur à l'intérieur d'un autre fournisseur dans Flutter

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)?


0 commentaires

4 Réponses :


0
votes

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);


0 commentaires

12
votes

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(
        ...
      ),
    );


1 commentaires

En plus de cela, voici un article qui explique tous les Provider - medium.com/flutter-community / ...



5
votes

À 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(
    ...
  ),
);


0 commentaires

0
votes

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.


0 commentaires