Search code examples
flutterdartflutter-layout

How to use a provider inside of another provider in Flutter


I want to create an app that has an authentication service with different permissions and functions (e.g. messages) depending on the user role.

So I created one Provider for the user and login management and another one for the messages the user can see.

Now, I want to fetch the messages (once) when the user logs in. In Widgets, I can access the Provider via Provider.of<T>(context) and I guess that's a kind of Singleton. But how can I access it from another class (in this case another Provider)?


Solution

  • Thanks for your answer. In the meanwhile, I solved it with another solution:

    In the main.dart file I now use ChangeNotifierProxyProvider instead of ChangeNotifierProvider for the depending provider:

    // main.dart
    return MultiProvider(
          providers: [
            ChangeNotifierProvider(builder: (_) => Auth()),
            ChangeNotifierProxyProvider<Auth, Messages>(
              builder: (context, auth, previousMessages) => Messages(auth),
              initialBuilder: (BuildContext context) => Messages(null),
            ),
          ],
          child: MaterialApp(
            ...
          ),
        );
    

    Now the Messages provider will be rebuilt when the login state changes and gets passed the Auth Provider:

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