Я хочу переопределить документ в флаттер пожарного магазина - PullRequest
1 голос
/ 14 апреля 2020

У меня есть коллекция с именем местоположение в пожарном депо, в нем есть документ с автоматически сгенерированными полями идентификаторов долгота и широта . Я хочу обновить эти два поля, когда когда-либо меняется местоположение. Моя проблема заключается в том, что при изменении местоположения значение добавляется в долгота и широта , но их идентификатор изменился, что означает, что эти поля не обновлялись, вместо обновления добавляются новые. Мой код: Класс модели

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
    };
  }

}

FirestoreService для добавления местоположения в firestore

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());
  }
}

В этом классе у меня есть Streame Builder, который выбирает мое местоположение, а также отображает мой длинный и лат в 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}'),


      );
    }),
    );
  }
}

Изображение моего пожарного магазина

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

У меня есть решение. Сначала я не получал идентификатор после получения идентификатора, я узнал, что мне нужно использовать stati c id для переопределения моего документа. Итак, решение:

Future<void> setNode(Node node) async {
  print('Id is: ${node.id}');
  return await _db.collection('location').document('dani').
  setData(node.toMap());
}
0 голосов
/ 14 апреля 2020

Вместо использования addNode и updateNode функций, которые добавляют и обновляют документы соответственно, используйте setNode, который использует функции setData firestore, которые будут создавать документ, если он не существует, и перезаписывать существующий документ. Это должно выглядеть примерно так:

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

Вам нужно будет найти способ установить идентификатор узла в другом месте, если вам нужно несколько узлов в коллекции location.

...