如何使用 ModelClass 从 Firebase 获取地图数组列表

问题描述 投票:0回答:2

下面添加了解决方案

我想在我的 ServiceModel 中对这个 Firebase 文档格式进行建模,它位于 SalonModel 中。

实际上,我可以为 SalonModel 建模整个字段,但每当我尝试为 ServiceModel 建模时,它都不起作用。

Firebase 文档屏幕截图:

enter image description here

这是 SalonModel 的一部分:

class SalonModel {
 String? uid;
 String? name;
SalonServices? salonServices;
SalonModel({this.uid, this.name, this.salonServices})

factory SalonModel.fromMap(Map<String, dynamic> map) {
    return SalonModel(
      uid: map['uid'],
      name: map['name'],
      salonServices: map['salonServices'] != null
          ? SalonServices.fromMap(map['salonServices'])
          : null,
    );


}

这是我的沙龙服务课程:

class SalonServices {
  String? serviceName;
  String? serviceDescription;
  bool? isActive;
  int? servicePrice;
  int? serviceDiscount;
  SalonServices({
    this.serviceName,
    this.serviceDescription,
    this.isActive,
    this.servicePrice,
    this.serviceDiscount,
  });

  Map<String, dynamic> toMap() {
    return {
      'serviceName': serviceName,
      'serviceDescription': serviceDescription,
      'isActive': isActive,
      'servicePrice': servicePrice,
      'serviceDiscount': serviceDiscount,
    };
  }

  factory SalonServices.fromMap(Map<String, dynamic> map) {
    return SalonServices(
      serviceName: map['serviceName'],
      serviceDescription: map['serviceDescription'],
      isActive: map['isActive'],
      servicePrice: map['servicePrice']?.toInt(),
      serviceDiscount: map['serviceDiscount']?.toInt(),
    );
  }
}

通过这个功能,我正在对这些字段进行建模:

Future<SalonModel> fetchMyDatas(String uid) async {
    var doc =
        await FirebaseFirestore.instance.collection('salons').doc(uid).get();

    Map<String, dynamic>? docData = doc.data();
    return SalonModel.fromMap(docData!);
  }

然后这个函数返回我这个错误:

未处理的异常:类型“List”不是类型的子类型 '地图'

如果我们转到抛出异常的位置,我们会看到这一行在 SalonModel.fromMap 中不起作用:

 salonServices: map['salonServices'] != null
          ? SalonServices.fromMap(map['salonServices'])
          : null,

遇到这种情况我能做什么?

更新

我无法绘制它。没有选择。 enter image description here

enter image description here

这是我的解决方案

在 SalonModel 类中;

  List<SalonServices>? salonServices;

然后在 SalonModel.fromMap 方法内部:

...
     salonServices: json['salonServices'] == null
                ? null
                : List<SalonServices>.from(
                    json['salonServices'].map((x) => SalonServices.fromMap(x)))

我们的 fetchMyDatas 最终运行良好。

flutter firebase google-cloud-firestore
2个回答
2
投票

这个映射似乎是错误的:

SalonServices? salonServices;

由于数据库中的

salonServices
中有一个对象数组,因此您也应该将其映射到模型类中的
SalonServices
数组/列表:

List<SalonServices> salonServices;

然后我期望映射代码是这样的:

salonServices: map['salonServices'] != null
    ? map['salonServices'].map((e) => SalonServices.fromMap(e))
    : null,

这里的

e
会一一指向数据库中
salonServices
节点下的子地图。如果您收到有关其类型的错误,您可能需要将
e
转换为
Map


0
投票

这是我的解决方案

在 SalonModel 类中;

  List<SalonServices>? salonServices;

然后在 SalonModel.fromMap 方法内部:

...
     salonServices: json['salonServices'] == null
                ? null
                : List<SalonServices>.from(
                    json['salonServices'].map((x) => SalonServices.fromMap(x)))

我们的 fetchMyDatas 最终运行良好。

© www.soinside.com 2019 - 2024. All rights reserved.