Как динамически добавлять поля документа определенной коллекции в Firestore, используя Map во флаттере? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть класс DatabaseService, в котором я поддерживаю и обновляю данные. Я использую карту для динамического обновления данных документа определенной коллекции в базе данных Firebase, но я не могу успешно обновить все данные, которые я использую с помощью простого forEach, чтобы извлечь данные из карты и сохранить их в базе данных Firebase

import 'package:home_crisp/models/user.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class DatabaseService {
  // collection reference is just reference for certain collection

  final CollectionReference chefCollection =
      Firestore.instance.collection('chef');

  final String uid;
  DatabaseService({this.uid});

  Future updateChefData(Map<String, dynamic> dataMap) async {
    // await chefCollection.document(uid).setData({
    //   'chefName': chefName,
    //   'chefPhNo': chefPhNo,
    //   'chefDateOfBirth': chefDateOfBirth,
    // });
    dataMap.forEach(
      (key, value) async {
        await chefCollection.document(uid).setData({
          key: value,   // Key represent the field key and value is actual value of firebase document i.e. chefName: "Peter" 
        });
      },
    );
  }

В Класс "chefRegistration" Я инкапсулирую значения в Map и отправляю их в функцию updateChefData в dataServices

class chefRegistration extends StatefulWidget {
  @override
  _chefRegistrationState createState() => _chefRegistrationState();
}
class _chefRegistrationState extends State<chefRegistration> {

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

// ~
// ~
// Some Code
// ~ 
// ~


FlatButton(
   onPressed: () async {
   Map<String, dynamic> dataMap = {
                'chefName': this.chefName,
                'chefPhNo': this.phoneNo,
                'chefDateOfBirth': this.dateOfBirth,
               };

                await DatabaseService(uid: user.uid).updateChefData(dataMap);
   }
} 

Ниже приведен скриншот того, как я хочу, чтобы он работал

enter image description here

Но проблема в том, что он обновляет только последнее поле документа dateOfBirth

enter image description here

1 Ответ

2 голосов
/ 03 мая 2020

Вы захотите использовать updateData () вместо setData (). Или вы можете передать merge: true в качестве второго аргумента setData () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...