I have already solved this problem, but I want to clean the code so it's easier to maintain.
The problem was: When using data that comes from Provider<T>, how can I make the providers and their data available in the next view when Navigator.of(context).push?
I solved it with this code:
await Navigator.of(context).push(
MaterialPageRoute(
builder: (_) {
return MultiProvider(
providers: [
Provider<User>.value(value: context.read<User>()),
Provider<Computer>.value(value: context.read<Computer>()),
],
builder: (_, __) => const TheNextScreen(),
);
},
fullscreenDialog: true,
),
);
This works properly, but I'm concerned about a few points:
- Is this a good design pattern? Or does it look like an anti-pattern? Is there a better way to do it?
- If I type
contextinstead of_, I'd end up overwriting the originalcontextvariable and use acontextthat does not have the providers, therefore increasing the risk of errors in the future (e.g. by calling.readon the incorrectcontext). - I saw some other questions and some people used
ChangeNotifierProviderinstead (Flutter Provider nested navigation). This seems like an OK solution and I know how to useChangeNotifierProvider, but as far as I know it doesn't allow a clean way to pass an array of providers, soMultiProviderwas my choice.
If there's any way to improve this code design (for example, related to the above concerns), that'd be a helpful answer.