[英](Flutter/Riverpod) the example of StateProvider document was not updated
Riverod 的 StateProvider 示例尚未更新。
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 stable 的正確代碼嗎?
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,
),
),
],
);
}
}
哎呀!
您的代碼是正確的,盡管您不必在build
中獲取通知程序,也可以在onTap
中進行:
onTap: () => ref.read(selectedProductIdProvider.notifier).state = product.id,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.