# #firebase #flutter #google-cloud-firestore #flutter-getx
Вопрос:
Контроллеры работают правильно, как и все остальное. Однако я не могу отображать данные, которые я добавил в свою базу данных firestore.
Ниже приведен виджет для отображения данных.
class ProductsWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Obx(() => GridView.count(
crossAxisCount: 2,
childAspectRatio: .63,
padding: EdgeInsets.all(10),
mainAxisSpacing: 4,
crossAxisSpacing: 10,
children: productsController.products.map((ProductModel product) {
return Text(product.name);
}).toList(),
));
}
}
Ниже приведен объект ProductsController
class ProductsController extends GetxController {
static ProductsController instance =
Get.find(); //creating an instance of Get.find. it returns the controller
//defining a list of products to be displayed on the app.
RxList<ProductModel> products = RxList<ProductModel>([]);
//name of collection to access on the database
String collection = 'products';
@override
void onReady() {
super.onReady();
//binding the products into a stream
products.bindStream(getAllProducts());
}
Stream<List<ProductModel>> getAllProducts() =>
firebaseFirestore.collection(collection).snapshots().map((query) =>
query.docs.map((item) => ProductModel.fromMap(item.data())).toList());
}
Ниже приведена модель продукта
class ProductModel {
static const ID = 'id';
static const NAME = 'name';
static const IMAGE = 'image';
static const PRICE = 'prep_time';
static const PREP_TIME = 'prep_time';
static const COOKING_TIME = 'cooking_time';
static const SERVES = 'serves';
static const DESCRIPTION = 'description';
static const INGREDIENTS = 'ingredients';
static const METHOD = 'method';
String id;
String name;
Image image;
String price;
String prep_time;
String cooking_time;
String serves;
String description;
List<String> ingredients;
List<String> method;
ProductModel(
{this.id,
this.name,
this.image,
this.price,
this.prep_time,
this.cooking_time,
this.serves,
this.description,
this.ingredients,
this.method});
ProductModel.fromMap(Map<String, dynamic> data) {
id = data[ID];
name = data[NAME];
image = data[IMAGE];
price = data[PRICE];
prep_time = data[PREP_TIME];
cooking_time = data[COOKING_TIME];
serves = data[SERVES];
description = data[DESCRIPTION];
ingredients = data[INGREDIENTS];
method = data[METHOD];
}
}
Вот представление данных в базе данных firestore
cooking_time
"1 hr and 5 mins"
(string)
description
"Make this easy chipolata, bean and roasted veg one-pan dish for a healthy, flavour-packed meal that the whole family will love. It offers four of your five-a-day "
id
"69lWeEFzCYhqDgHuTOYu"
image
"https://firebasestorage.googleapis.com/v0/b/seddi-89190.appspot.com/o/sausage.jpg?alt=mediaamp;token=e3c5a3af-b17a-4cfe-871e-d81797cc851b"
ingredients
0
"1 red or yellow pepper, deseeded and cut into chunks"
1
"2 carrots, cut into thick slices"
2
"2 red onions, cut into wedges"
3
"8 chipolatas, cut into thirds"
4
"400g can peeled cherry tomatoes"
5
"400g can white beans, drained"
6
"200ml low-salt chicken stock"
7
"2 tsp Dijon mustard"
8
"100g frozen peas"
9
"potatoes, pasta or rice, to serve"
method
0
"STEP 1: Heat oven to 220C/200C fan/gas 7. Roast the pepper, carrots and onion in a deep baking dish for 15 mins. Add the sausages and roast for a further 10 mins."
1
"STEP 2: Reduce oven to 200C/180C fan/gas 6, tip in the tomatoes and beans, then stir in the stock. Cook for another 35 mins. Stir in the mustard and peas and return to the oven for 5 mins. Rest for 10 mins, then serve with potatoes, pasta or rice"
name
"Sausage amp; white bean casserole"
prep_time
"20 mins"
price
"20000"
serves
"4"
Ответ №1:
Stream<List<ProductModel>> getAllProducts() async{
await firebaseFirestore.collection(collection).snapshots().map((query) =>
query.docs.map((item) => ProductModel.fromMap(item.data())).toList());
}
замените свою функцию getallproducts на эту.
Комментарии:
1. Большое тебе спасибо, Прашант. Но я получаю ошибку, когда пытаюсь вызвать GetAllProducts. Тип аргумента «Будущее<Поток<Список<Модель продукта><Модель продукта>><Модель продукта>>>» не может быть присвоен типу параметра » Поток<Модель продукта>>><Список<Модель продукта><Модель продукта>>
2. Будущее<Поток<Список<Модель продукта><Модель продукта>><Модель продукта>> > Получить все продукты() асинхронно{ ожидание firebaseFirestore.коллекция(коллекция).снимки().карта((запрос) =<Модель продукта>>>> запрос.документы.карта((элемент) =<Модель продукта>>>>> > Модель продукта.fromMap(элемент.данные ())). Список ());} попробуйте это
3. Еще раз спасибо, я добавил тип возвращаемого значения как будущее, но когда я связываю продукты в поток с помощью этого кода products.bindStream(GetAllProducts()); он показывает GetAllProducts() как ошибку подчеркивания и показывает эту ошибку: тип аргумента «Будущее<Поток<Список<Продуктмодель><Продуктмодель>><Продуктмодель>>>» не может быть присвоен типу параметра » Поток<Продуктмодель>>><Список<Продуктмодель><Продуктмодель>>
4. Другой вариант, который я пробовал, — удалить Future как тип возврата и использовать async*, но он также ничего не отображает. Код показан ниже; Поток<Список<ProductModel><ProductModel>> GetAllProducts() асинхронно* { ожидание firebaseFirestore.коллекция(коллекция).снимки().карта((запрос) =<ProductModel>>> запрос.документы.карта((элемент) =<ProductModel>>>> > ProductModel.fromMap(item.data ())). Список ()); }