Ошибки нет, но я не получаю данные из своей базы данных firestore при использовании getX flutter

# #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 ())). Список ()); }