You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:54:03