下面添加了解决方案
我想在我的 ServiceModel 中对这个 Firebase 文档格式进行建模,它位于 SalonModel 中。
实际上,我可以为 SalonModel 建模整个字段,但每当我尝试为 ServiceModel 建模时,它都不起作用。
Firebase 文档屏幕截图:
这是 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,
遇到这种情况我能做什么?
更新
这是我的解决方案
在 SalonModel 类中;
List<SalonServices>? salonServices;
然后在 SalonModel.fromMap 方法内部:
...
salonServices: json['salonServices'] == null
? null
: List<SalonServices>.from(
json['salonServices'].map((x) => SalonServices.fromMap(x)))
我们的 fetchMyDatas 最终运行良好。
这个映射似乎是错误的:
SalonServices? salonServices;
由于数据库中的
salonServices
中有一个对象数组,因此您也应该将其映射到模型类中的 SalonServices
数组/列表:
List<SalonServices> salonServices;
然后我期望映射代码是这样的:
salonServices: map['salonServices'] != null
? map['salonServices'].map((e) => SalonServices.fromMap(e))
: null,
这里的
e
会一一指向数据库中salonServices
节点下的子地图。如果您收到有关其类型的错误,您可能需要将 e
转换为 Map
。
这是我的解决方案
在 SalonModel 类中;
List<SalonServices>? salonServices;
然后在 SalonModel.fromMap 方法内部:
...
salonServices: json['salonServices'] == null
? null
: List<SalonServices>.from(
json['salonServices'].map((x) => SalonServices.fromMap(x)))
我们的 fetchMyDatas 最终运行良好。