首页 > 解决方案 > 如何获取包含对象列表的文档?- 火库

问题描述

我需要在 firestore 中获取包含对象列表的文档

doc 1
     id:123
     name: product1
     categories:
    [0]
    catid:21
    name: category21
    [1]
    catid:34
    name: category34
doc 2 
     id:456
     name: product2
     categories:
    [0]
    catid:9
    name: category9
    [1]
    catid:4
    name: category4

我终于达到了如何添加带有类别对象列表的产品(因为我在下面的 productModel 中定义了类别),但是我无法获得带有类别对象列表的产品:(
我在 ProductModel 中尝试过

if(data[CATEGORIES] != null){
  //  categories.add(data[CATEGORIES].map());
   categories.add(CategoryModel.fromMap(data[CATEGORIES]));
   // categories.addAll(data[CATEGORIES].values());
  //  categories = data[CATEGORIES].map((i) => i.fromMap());
   };

但它们都不适用于味精:

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, 
dynamic>'

火库:

getProducts(ProductProvider productProvider) async{
  QuerySnapshot snapshot= await Firestore.instance.collection('products').getDocuments();
  List<ProductModel> _productList=[];
   snapshot.documents.forEach((document){
    ProductModel product= ProductModel.fromMap(document.data);
    _productList.add(product);
  });
  productProvider.productList=_productList;
}

uploadProduct(ProductModel product) async {
  CollectionReference productRef = Firestore.instance.collection('products');
    DocumentReference documentRef = await productRef.add(product.toMap());
    product.id = documentRef.documentID;
    print('uploaded product successfully: ${product.toString()}');
    await documentRef.setData(product.toMap(), merge: true);
  }
}

数据模型

ProductModel{
String id;
String name;
List<CategoryModel> categories

ProductModel.fromMap(Map<String, dynamic> data){
   id = data['id'];
   name= data['name'];
   categories = data['categories']; // ?? 
}
Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name':name,
      'categories': categories.map((i) => i.toMap()).toList(),  // this worked well 

};}}

CategoryModel{
String id;
String name;

CategoryModel.fromMap(Map<String, dynamic> data){
   id = data['id'];
   name= data['name'];
}
Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name':name,
};}}

标签: jsonflutterdartgoogle-cloud-firestore

解决方案


如果data['categories']Map<String, dynamic>[]

您可以将数据映射到类别模型列表。

    categories = data['categories']
        .map<CategoryModel>((value) => CategoryModel.fromMap(value))
        .toList();

推荐阅读