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

如何将List中全部数据以多Map形式存入单个Firestore文档

问题根因

原代码仅能存储单条数据的核心原因:

  • setData默认是覆盖写入模式,未开启merge: true时,每次调用都会清空文档原有内容后写入新数据,多次调用仅会保留最后一次写入结果
  • 用dataInt作为动态键名时未做处理,Dart会将其识别为固定字符串键名而非变量值,导致写入逻辑不符合预期

按顺序编号存储的实现方案

推荐优先选择「批量组装数据后一次性写入」的方案,性能更稳定,也不会出现写入顺序混乱的问题:

void saveSelectedRoute() async {
  Map<String, dynamic> routeContent = {};
  // 遍历选中站点列表,按列表索引作为编号键
  for (int index = 0; index < _selectedBusStop.length; index++) {
    String stopName = _selectedBusStop[index];
    // 替换为你实际查询站点GeoPoint的逻辑
    var stopDoc = await Firestore.instance.collection("你的站点集合名").document(stopName).get();
    GeoPoint location = stopDoc.data["location"];
    routeContent[index.toString()] = {
      "Lat": location.latitude,
      "Lng": location.longitude
    };
  }
  // 一次性写入所有数据到目标文档
  await Firestore.instance.collection("routes").document(inputName).setData(routeContent);
}

如果要保留原有的initRoute循环调用写法,只需要修改两处即可:

void initRoute(data, int dataInt) async{
  Firestore.instance.collection('routes').document(inputName).setData({
    // 变量作为键名需要放在方括号内,转字符串避免类型问题
    dataInt.toString(): {
      "Lat" : data['location'].latitude,
      "Lng" : data['location'].longitude
    }
  // 开启merge模式,新数据合并到原有文档中不覆盖
  }, merge: true);
}

现有实现注意事项

你目前使用站点名作为键名加merge: true的方案已经可以实现全量写入,但存在两个限制:

  • 键名为站点名称,无法直接对应你最初要求的选择顺序编号,后续生成Polyline时需要自行排序
  • 每次写入都是独立网络请求,站点数量较多时会增加请求耗时和失败概率,建议优先用批量写入方案

内容的提问来源于stack exchange,提问作者randomstudent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:48:04