如何从Firestore数据库解析文档

时间:2019-01-11 14:46:20

标签: dart flutter google-cloud-firestore

如何解析Firestore中的数据。我的文档看起来像:Produkte is an array. The Array includes maps with a String and a Number

使用此代码,我得到了数据。

StreamBuilder(
            stream: Firestore.instance.collection("Benutzer").document("Anton").collection("Einkaufsliste").snapshots(),
            builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index){
                  return  ExpansionTile(
                    title: Text(snapshot.data.documents[index].documentID),
                    children: buildCheckBoxListTile(index, snapshot),

buildCheckBoxListTile(index, snapshot)函数中,我想从地图中获取数据。那么,我该如何解析这些数据?

谢谢您的帮助。

编辑: 我创建了一个Produkte类:

class Produkte{
  Produkte({this.produktList});

  List<Produkt> produktList;

  factory Produkte.fromJson(Map<String, dynamic> parsedJson){
    var list = parsedJson["Produkte"] as List;
    List<Produkt> products = list.map((i) => Produkt.fromJson(i)).toList();

    return Produkte(
      produktList: products,
    );
  }
}

还有一个班级产品:

class Produkt{
  Produkt({this.name, this.anzahl});

  String name;
  int anzahl;

  factory Produkt.fromJson(Map<String, dynamic> parsedJson){
    return Produkt(
      name: parsedJson["Name"],
      anzahl: parsedJson["Anzahl"]
    );
  }
}

现在当我这样称呼时:Produkte Hans = Produkte.fromJson(snapshot.data.documents[index].data); 引发以下异常:  I/flutter (18038): Another exception was thrown: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'

1 个答案:

答案 0 :(得分:0)

我有同样的问题。我正在使用json_serializable 软件包进行自动生成。

对我来说,从地图上删除演员类型很有帮助

  factory Produkt.fromJson(Map parsedJson)

并允许在注释上添加任何地图

@JsonSerializable(anyMap: true)

flutter repository中对此主题进行了一些讨论。 HerrNiklasRaab也在那里发布了另一种解决方法:

  factory Chat.fromJson(Map<String, dynamic> json) {
    json["members"] = (json['members'] as List)
          ?.map((e) =>
              e == null ? null : Map<String, dynamic>.from(e))
          ?.toList();
     return _$ChatFromJson(json);  
  }