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)?
MultiProvider class Null safetyA provider that merges multiple providers into a single linear widget tree. It is used to improve readability and reduce boilerplate code of having to nest multiple layers of providers.
A provider that builds a value based on other providers. The exposed value is built through either create or update , then passed to InheritedProvider.
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();
}
}
...
}
From version >=4.0.0, we need to do this a little differently from what @updatestage has answered.
return MultiProvider(
providers: [
ChangeNotifierProvider(builder: (_) => Auth()),
ChangeNotifierProxyProvider<Auth, Messages>(
update: (context, auth, previousMessages) => Messages(auth),
create: (BuildContext context) => Messages(null),
),
],
child: MaterialApp(
...
),
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With