如何在Flutter与Firebase项目中存储并使用营业时间数据
问题核心原因
- 你的类定义存在低级错误:类名是
Business,但构造函数命名成了CommentModel,首先要修正这个问题 - Firestore(Firebase数据库)所有的JSON键默认都是字符串类型,你本地声明的
openingHours是Map<int, List<int>>,键类型不匹配无法直接赋值 - Firestore返回的列表值是
List<dynamic>类型,没有做类型转换直接赋值给List<int>会触发类型异常 - 上传的时候
int类型的键不会自动转成字符串,Firestore会识别失败
修正后的完整Business类代码
class Business{ String businessId; String name; String photoUrl; Map<int, List<int>> openingHours; // 修正构造函数命名 Business({ this.name, this.businessId, this.photoUrl, this.openingHours }); Business.fromJson(Map<String, dynamic> json) { name = json['name']; businessId = json['businessId']; photoUrl = json['photoUrl']; // 处理openingHours类型转换 if (json['openingHours'] != null) { openingHours = {}; json['openingHours'].forEach((key, value) { // 字符串键转int类型 int weekDay = int.parse(key); // 值非空的话把dynamic列表转成List<int> List<int> hours = value?.cast<int>(); openingHours[weekDay] = hours; }); } } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['name'] = name; data['businessId'] = businessId; data['photoUrl'] = photoUrl; if (openingHours != null) { // int类型键转字符串,符合Firestore要求 data['openingHours'] = openingHours.map((key, value) => MapEntry(key.toString(), value)); } return data; } }
使用注意事项
- 上传数据时直接调用
toJson()方法传入Firestore即可,歇业的星期直接赋值null会自动按照你选定的格式存储 - 读取数据时用
Business.fromJson(documentSnapshot.data())就能直接得到类型正确的openingHours属性 - 可以额外加边界校验:比如转换星期键的时候如果出现非数字的异常键,可以直接跳过或者做容错处理,避免脏数据导致应用崩溃
内容的提问来源于stack exchange,提问作者Seonaidh Morrison
相关产品推荐
相关产品推荐

