recently I was reading about Riverpod State management in Flutter, and I started using it in my App, I wanted to give a random List of image paths when I press refresh button on my Ui,I made a StateProvider to get the List of random paths from Unsplash url, here is my code
final imgsPathsProvider = StateProvider<List<String>>((ref) {
return List.generate(
10,
(index) =>
'https://source.unsplash.com/random/?night&${Random().nextInt(1000)}');
});
now I used this provider in my UI when I’m pressing on refresh button, here is my code and it worked well:
TextButton(
onPressed: () {
ref.read(imgsPathsProvider.notifier).update((state) {
return List.generate(
10,
(index) =>
'https://source.unsplash.com/random/?night&${Random().nextInt(1000)}');
});
},
child: const Text('refresh'))
the thing is when I press refresh button I want to rebuild the provider to get a random List of images, instead of repeating the code, I feel like I broke DRY principle, this is very simple use case so I used StateProvider instead of NotifierProvider, should I use NotifierProvider instead, and define a method and call it in the UI when pressing refresh? or is there any method to rebuild the state of my StateProvider?
2
Answers
The update function will rebuild the state but you need to watch the provider to do the same.
Use this variable to watch the provider and use this in the view that is displaying the images.
Alternatively you can aslo use this to update the state.
If you simply want to recompute a provider, there is an invalidate method available for
WidgetRef
.Note that
invalidate
also works on family provider with or without family parameters, meaning that you could invalidate all family provider or a specific family provider.And yes, it is recommended to use
NotifierProvider
instead ofStateProvider
mainly for the below reasons.StateProvider
is place inside the widget and it is not reusable and hard to maintain. UsingNotifierProvider
can centralise the logic.StateProvider
.