首页 > 解决方案 > Flutter:解析 Firebase 实时数据库快照以列出

问题描述

我尝试搜索其他问题,但唯一与此类似的问题在JavaScript而不是 Dart/Flutter 中有答案。我正在尝试将我的 Firebase 实时数据库中的列表作为List<BaseModel>

到目前为止,从我在网上搜索的内容来看,我认为结果DataSnapshot是一个我可以解析的地图,所以我试了一下,但得到了这个错误:List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>

我的代码:

Future<List<BaseModel>> getList(
    {DatabaseReference query, Models modelType}) async {
  List<BaseModel> list = new List();
  DataSnapshot snap = await query.once();
  Map<String, dynamic> json = Map.from(snap.value);
  json.forEach((key, value) {
    list.add(BaseModel(model: modelType, key: key, snapshot: value));
  });
  return list;
}

奇怪的是,即使我尝试解析非列表模型,我也会得到同样的错误。

我的数据库结构如下所示:

在此处输入图像描述

更新:

基本型号:

abstract class BaseModel {
  factory BaseModel({Models model, String key, Map map}) {
    switch (model) {
      case Models.MyModel:
        return MyMod.fromSnapshot(key: key, map: map);
        break;
      default:
        throw ("Not a valid model.");
    }
  }
}

我的模型:

MyModel.fromSnapshot({String key, Map map}) {
  _id = key;
  _title = map['title'];
}

我的 Firebase 查询只是数据库参考.child("Root")

标签: flutterdart

解决方案


我找到了解决办法!

我的新代码:

Future<List<BaseModel>> getList({DatabaseReference query, Models modelType}) async {
  List<BaseModel> list = new List();
  DataSnapshot snap = await query.once();
  List<dynamic> resultList = snap.value;
  for(var i = 0; i < resultList.length; i++) {
    Map<dynamic, dynamic> map = Map.from(resultList[i]);
    list.add(BaseModel(model: modelType, key: i.toString(), snapshot: map));
  }
  return list;
}

假设您从模型的.fromMap(yourMap)构造函数方法中解析值,这应该可以工作。就像是_title = yourMap['key'];


推荐阅读