Как заполнить список из потока без виджета сборки с помощью Riverpod
Я пытаюсь создать приложение, в котором
- У меня есть список продуктов
- Я использую StreamProvider, чтобы получить этот список из Firebase, и он отлично работает.
- Я хочу, чтобы для начала все товары были помещены в корзину. Причина в том, что в этом приложении для покупок пользователю сначала должны быть представлены все продукты в корзине, а затем он решает, какие продукты они хотят сохранить или удалить.
Это мой 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'
Итак, мои вопросы.
Я ошибаюсь? Если да, то как лучше всего иметь список, принадлежащий другому провайдеру (cartRiverpodProvider), заполненный потоком, исходящим из (productListStreamProvider)?
Мне вообще нужно использовать двух провайдеров для этого сценария?