Как заполнить список из потока без виджета сборки с помощью Riverpod

Я пытаюсь создать приложение, в котором

  1. У меня есть список продуктов
  2. Я использую StreamProvider, чтобы получить этот список из Firebase, и он отлично работает.
  3. Я хочу, чтобы для начала все товары были помещены в корзину. Причина в том, что в этом приложении для покупок пользователю сначала должны быть представлены все продукты в корзине, а затем он решает, какие продукты они хотят сохранить или удалить.

Это мой StreamProvider. Этот код отлично работает.

      final productListStreamProvider = StreamProvider.autoDispose<List<ProductModel>>((ref) {
  CollectionReference ref = FirebaseFirestore.instance.collection('products');
  return ref.snapshots().map((snapshot) {
    final list = snapshot.docs
        .map((document) => ProductModel.fromSnapshot(document))
        .toList();
    return list;
  });
});

Итак, вот в чем проблема. Получив список продуктов, я пытаюсь сделать следующее.

      class ListProducts extends ConsumerWidget {
  ListProducts({Key key}) : super(key: key);
  final double itemHeight = 130;
  final double itemWidth = Get.width / 2 - 100;

  @override
  Widget build(BuildContext context, ScopedReader watch) {
   final productStream = watch(productListStreamProvider);
   final cartList = watch(cartRiverpodProvider.state);
   int i;
   for(i=0;i<productStream.data.value.length;i++)
     {
       context.read(cartRiverpodProvider).add(
           productStream.data.value[i]);
     }

   return ListView.builder(
       padding: const EdgeInsets.all(8),
       itemCount: productStream.data.value.length,
       itemBuilder: (BuildContext context, int index) {
         return ListTile(
             title: Text(productStream.data.value[index].productName),

             subtitle: Text('Date: ${timeago.format(productStream.data.value[index].createdOn.toDate())} Tracking Number: ${productStream.data.value[index].receivedTrackingNumber} Weight: ${productStream.data.value[index].weight.toString()} grams'),
           onTap: () {
              Navigator.pushNamed(context, '/products', arguments: productStream.data.value[index].id.toString());
         },


         );
       }
   );
  }

  }

Я получаю эту ошибку.

      ======== Exception caught by widgets library =======================================================
The following Error was thrown building ListProducts(dirty, dependencies: [UncontrolledProviderScope], state: _ConsumerState#09d50):
Instance of 'Error'

Итак, мои вопросы.

  1. Я ошибаюсь? Если да, то как лучше всего иметь список, принадлежащий другому провайдеру (cartRiverpodProvider), заполненный потоком, исходящим из (productListStreamProvider)?

  2. Мне вообще нужно использовать двух провайдеров для этого сценария?

0 ответов

Другие вопросы по тегам