我想覆盖 firestore flutter 中的文档

I want to override document in firestore flutter

我在 firestore 中有一个名为 location 的集合,我有带有自动生成 ID 的文档 字段 longitudelatitude。我想在位置更改时更新这两个字段。我的问题是当位置改变时,值被添加到 longitudelatitude 但他们的 id 改变意味着这些字段没有更新而不是更新它增加了一个新的。我的代码是: 型号class

class Node{
  String longitude;
  String latitude;
  String id;

  Node({this.longitude, this.latitude, this.id});

  Node.fromMap(Map<String, dynamic> data, String id):
  longitude = data['longitude'],
  latitude = data['latitude'],
  id=id;

  Map<String, dynamic> toMap(){
    return {
      'longitude':longitude,
      'latitude' : latitude
    };
  }

}

用于在 firestore 中添加位置的 FirestoreService

import 'package:cloud_firestore/cloud_firestore.dart';

import 'node.dart';
class FirestoreService {
  static final FirestoreService _firestoreService =
  FirestoreService._internal();
  Firestore _db = Firestore.instance;

  FirestoreService._internal();

  factory FirestoreService() {
    return _firestoreService;
  }

  Future<void> addNode(Node node)async{
    return await _db.collection('location').add(node.toMap());

  }


  Future<void> updateNode(Node node){
    return _db.collection('location').document(node.id).
    updateData(node.toMap());
  }
}

在这个 class 中,我有一个 streame 生成器,它可以获取我的位置并将我的经纬度显示到 textview

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_realtime_location/services/geolocator_service.dart';
import 'firestore_service.dart';
import 'node.dart';

class MapLocationSendFirestore extends StatefulWidget {
 MapLocationSendFirestore({Key key}) : super(key: key);

  @override
  _MapLocationSendFirestoreState createState() => _MapLocationSendFirestoreState();
}

class _MapLocationSendFirestoreState extends State<MapLocationSendFirestore> {
  final GeolocatorService geoService=GeolocatorService();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
  body: StreamBuilder<Position>(
    stream: geoService.getUserLocation(),
    builder: (context, snapshoot){
      Node node= Node(longitude: snapshoot.data.longitude.toString(), 
                latitude: snapshoot.data.latitude.toString());
              FirestoreService().addNode(node);
      if(!snapshoot.hasData) 
      {
        return Center(child: CircularProgressIndicator());
      }
      return Center(
        child: Text('${snapshoot.data.latitude} and ${snapshoot.data.longitude}'),


      );
    }),
    );
  }
}

Image of my firestore

不要使用分别添加和更新文档的 addNodeupdateNode 函数,而是使用使用 firestore 的 setData 函数的 setNode,这将创建文档,如果它不存在并覆盖现有文档。它应该看起来像这样:

Future<void> setNode(Node node){
  return _db.collection('location').document(node.id).
  setData(node.toMap());
}

如果您需要 location 集合中的多个节点,您将不得不想办法在另一个地方设置节点的 ID。

我找到了解决办法。首先我在获得 id 后没有得到 id 我开始知道我必须使用静态 id 来覆盖我的文档。所以一个解决方案是:

Future<void> setNode(Node node) async {
  print('Id is: ${node.id}');
  return await _db.collection('location').document('dani').
  setData(node.toMap());
}