(Flutter / Riverpod) пример документа stateProvider не был обновлен

#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. Это правильно