#flutter #riverpod
#flutter #riverpod
Вопрос:
Пример stateProvider Riverod еще не обновлен.
https://pub.dev/documentation/riverpod/latest/riverpod/StateProvider-class.html
final selectedProductIdProvider = StateProvider<String?>((ref) => null);
final productsProvider = StateNotifierProvider<ProductsNotifier, List<Product>>(
(ref) => ProductsNotifier());
Widget build(BuildContext context, WidgetRef ref) {
final List<Product> products = ref.watch(productsProvider);
final selectedProductId = ref.watch(selectedProductIdProvider);
return ListView(
children: [
for (final product in products)
GestureDetector(
onTap: () => selectedProductId.state = product.id,
child: ProductItem(
product: product,
isSelected: selectedProductId.state == product.id,
),
),
],
);
}
Теперь, когда Riverpod стал стабильным v1, приведенный выше код больше не работает.
Является ли следующий правильный код для Riverpod v1 стабильным?
final selectedProductIdProvider = StateProvider<String?>((ref) => null);
final productsProvider = StateNotifierProvider<ProductsNotifier, List<Product>>(
(ref) => ProductsNotifier());
class Foo2 extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final List<Product> products = ref.watch(productsProvider);
final String? selectedProductId = ref.watch(selectedProductIdProvider);
final StateController<String?> selectedProductIdController =
ref.watch(selectedProductIdProvider.notifier);
return ListView(
children: [
for (final product in products)
GestureDetector(
onTap: () => selectedProductIdController.state = product.id,
child: ProductItem(
product: product,
isSelected: selectedProductId == product.id,
),
),
],
);
}
}
Ответ №1:
Ой!
Ваш код правильный, хотя вам не нужно получать уведомитель внутри build
и вы можете сделать это внутри onTap
:
onTap: () => ref.read(selectedProductIdProvider.notifier).state = product.id,
Комментарии:
1. Спасибо за ответ. Позвольте мне подтвердить, правильно ли я понимаю «когда использовать ref.watch и ref.read» или нет. [в методе сборки] ссылка.watch(selectedProductIdProvider.notifier) [в функции обратного вызова] ссылка.read(selectedProductIdProvider.notifier) Это правильно?
2. Это правильно