недавно я читал об управлении состоянием Riverpod во Flutter и начал использовать его в своем приложении. Я хотел предоставить случайный список путей к изображениям, когда я нажимаю кнопку обновления в своем пользовательском интерфейсе, я создал StateProvider, чтобы получить список случайных путей. из URL-адреса Unsplash, вот мой код
final imgsPathsProvider = StateProvider<List<String>>((ref) {
return List.generate(
10,
(index) =>
'https://source.unsplash.com/random/?night&${Random().nextInt(1000)}');
});
теперь я использовал этого провайдера в своем пользовательском интерфейсе, когда нажимаю кнопку обновления, вот мой код, и он работал хорошо:
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'))
дело в том, что когда я нажимаю кнопку обновления, я хочу перестроить поставщика, чтобы получить случайный список изображений, вместо повторения кода, я чувствую, что нарушил принцип DRY, это очень простой вариант использования, поэтому я использовал StateProvider вместо NotifierProvider, следует ли мне вместо этого использовать NotifierProvider, определить метод и вызвать его в пользовательском интерфейсе при нажатии кнопки обновления? или есть ли способ восстановить состояние моего StateProvider?
И, в частности, StateProvider<List<Anything>> будет проблематичным, поскольку мутации списка не будут вызывать события.





Функция обновления восстановит состояние, но вам нужно следить за тем, чтобы провайдер делал то же самое.
Используйте эту переменную для наблюдения за поставщиком и используйте ее в представлении, отображающем изображения.
final images = ref.watch(imgsPathsProvider);
В качестве альтернативы вы также можете использовать это для обновления состояния.
ref.read(imgsPathProvider.notifier).state = List.generate(
10,
(index) =>
'https://source.unsplash.com/random/?night&${Random().nextInt(1000)}');
});
спасибо, но функция обновления не сработала, когда я возвращаю то же состояние, поэтому мне пришлось снова вернуть список и нарушить принцип DRY, то же самое, если бы я снова присвоил списку состояние ref.read(imgsPathProvider.notifier). state =, я буду повторять код, поэтому проверьте ответ, что я принял его как истинный ответ, у меня это сработало
Если вы просто хотите пересчитать поставщика, для WidgetRef доступен метод инвалидировать.
onPressed: () {
ref.invalidate(imgsPathsProvider);
},
Обратите внимание, что invalidate также работает с семейным поставщиком с параметрами семьи или без них, а это означает, что вы можете аннулировать всех семейных поставщиков или конкретного семейного поставщика.
И да, рекомендуется использовать NotifierProvider вместо StateProvider главным образом по следующим причинам.
StateProvider находится внутри виджета, ее нельзя использовать повторно, и ее сложно поддерживать. Использование NotifierProvider может централизовать логику.StateProvider.Спасибо, недействительный метод сработал хорошо, я не знал об этом раньше, и спасибо за ваше мнение о том, что рекомендуется, но мое приложение настолько простое, что просто обновляет список, чтобы получить новые изображения и отображать их в сетке, и не более того. необходимо действие или взаимодействие с пользователем, поэтому я думаю, что использование StateProvider для предоставления списка случайных изображений и нажатия кнопки обновления и повторного вычисления поставщика по этой строке в пользовательском интерфейсе будет хорошим, не так ли? но стоит отметить, что генерация кода RiverPod не поддерживает StateProvider. еще раз спасибо
Избегайте устаревших инструментов Riverpod. Короче говоря, избегайте устаревших ChangeNotifier, StateNotifier (и их поставщиков) и StateProvider. Используйте только Provider, FutureProvider, StreamProvider и Notifier, AsyncNotifier, StreamNotifier (и их поставщиков).