我想覆盖 firestore flutter 中的文档
I want to override document in firestore flutter
我在 firestore 中有一个名为 location 的集合,我有带有自动生成 ID 的文档
字段 longitude 和 latitude。我想在位置更改时更新这两个字段。我的问题是当位置改变时,值被添加到 longitude 和 latitude 但他们的 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
不要使用分别添加和更新文档的 addNode
和 updateNode
函数,而是使用使用 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());
}
我在 firestore 中有一个名为 location 的集合,我有带有自动生成 ID 的文档 字段 longitude 和 latitude。我想在位置更改时更新这两个字段。我的问题是当位置改变时,值被添加到 longitude 和 latitude 但他们的 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
不要使用分别添加和更新文档的 addNode
和 updateNode
函数,而是使用使用 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());
}