【问题标题】:Storing List into Firestore In Multiple Map将列表存储到多个地图中的 Firestore
【发布时间】:2021-10-20 09:51:19
【问题描述】:

您好,我想将列表存储到 Firestore。 我正在处理一个项目,在此页面中,我需要选择一些选择(选择是 DocumentID)并将其存储在 List 中,之后我需要从 List 中检索并再次调用 Firestore 以获取基于List 的项目的GeoPointList 包含 DocumentID)。然后,由于社区的帮助,我也能够找回它。但现在我只能存储List 的一项,而不是全部。

这是我的代码:

  void initRoute(data, dataInt) async{
    Firestore.instance.collection('routes').document(inputName).setData({
      dataInt:{
        "Lat" : data['location'].latitude,
        "Lng" : data['location'].longitude
      }
    });
  }

我可以存储,但它只将列表中的第一个项目存储到 Firestore。我怎样才能将它们全部存储到只有 1 个文档中,其中很少有 Map 类似于下图的内容。

还有Map 的名称,我可以根据列表中有多少项目生成它(第一个项目得到 0,第二个项目得到 1,依此类推......)并在存储时添加它?非常感谢您。

编辑: dataInt 是用来编号的,但我失败得很惨,但仍然不知道如何让它工作。

更新: 我正在从 Firestore 获取所有 List。 首先,我们从这里选择一些:

然后选择后会将名称存储到List

List的使用代码:

List<String> _selectedBusStop = List<String>();

onTaponLongPress时添加到List的代码

onTap: (){
            if(_selectedBusStop.contains(user.data['BusstopName'])){
              setState(() {
                _selectedBusStop.removeWhere((val) => val == user.data['BusstopName']);
              });
            }
          },
          onLongPress: (){
              setState(() {
                _selectedBusStop.add(user.data['BusstopName']);
              });
          }

因为列表中只保存了 BusstopName,所以我需要从 Firestore 中再次读取并获取我需要的 GeoPoint。将其保存在Map 中并将其用作Polyline。现在,当我调用setData 时,我目前无法将List 中的所有项目保存到Firestore 中,因为它只能在List 中保存1 个项目并且我想存储全部。

抱歉再次造成误会。真的很抱歉。

更新我可以将列表中的所有项目存储到 Firestore 中

  void initRoute(data, dataInt) async{
    Firestore.instance.collection('routes').document(inputName).setData({
      data['BusstopName']:{
        "Lat" : data['location'].latitude,
        "Lng" : data['location'].longitude
      }
    }, merge: true);
  }

使用此代码。

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    首先在本地创建一个Map,给它你想要的int:

    Map<String,dynamic> dataToBeSent ={ 
           '0': {
            "Lat" : data['location'].latitude,
            "Lng" : data['location'].longitude}
            }
    

    现在,在发送到 firebase 之前,您知道这是否是第一个 LatLng,如果是第一个,则使用 .set,如下所示:

    Firestore.instance.collection('routes').document(inputName).setData(dataToBeSent);
    

    这将创建一个新文档,其坐标位于 Map 内,并且具有您想要的索引。稍后,您想在此文档中添加另一个 LatLng,使用.update,并发送新的Map

    Map<String,dynamic> dataToBeSent2 ={ 
           '2': {
            "Lat" : data['location'].latitude,
            "Lng" : data['location'].longitude}
            }
    
    Firestore.instance.collection('routes').document(inputName).updateData(dataToBeSent2);
    
    

    这将不断更新您发送的密钥,但请注意不要使用相同的 id 存储新地图,例如 0,它会覆盖当前在 firebase 中的密钥 0 处的内容。


    根据您的编辑和评论回复,首先从以下内容开始:

      void initRoute(data, dataInt) async{
        if(data.isNotEmpty){
          for(int a = 0; a < data; a++){
            Map<String,dynamic> dataToBeSent={
              $a:{
                "Lat" : data['location'].latitude,
                "Lng" : data['location'].longitude
              }
            };
            Firestore.instance.collection('routes').document(inputName).setData(dataToBeSent);
          }
        }
      }
    

    【讨论】:

    • 这行得通,每当您需要更新任何索引时,只需使用 `.updateData{'$i':{'Lat':...etc}}
    • 将索引从i++ 转换为字符串作为键使用即可。
    • 您需要先在本地将列表转换为地图,然后将其发送到 firebase。请分享您的多边形列表示例,我们将对其进行转换
    • 没关系,我编辑了我的答案,现在检查一下。但这只会添加我假设的一项。首先,让它添加一个项目,然后我们可以创建更多项目。
    • 尝试使用a.toString() 而不是$a
    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2018-04-16
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多