How to merge the field in the collection of firestore document field with flutter?

Viewed 18

FlutterFire, Firestore is creating a new document with same id, instead of merging the field to the existing document Id. Unable to understand what I am doing wrong. function addDeliveryAgent

enter image description here firebase_database.dart

class FirebaseDatabase {
  CollectionReference<Map<String, dynamic>> users =
      FirebaseFirestore.instance.collection('users');
  CollectionReference<Map<String, dynamic>> orders =
      FirebaseFirestore.instance.collection('testorders');
  CollectionReference<Map<String, dynamic>> testorders =
  FirebaseFirestore.instance.collection('testorders');
  CollectionReference<Map<String, dynamic>> agent =
      FirebaseFirestore.instance.collection('deliveryAgent');


 

  Future<List<String>> getDeliveryAgent() async {
    List<String> deliveryAgent = [];
    try {
      QuerySnapshot<Map<String, dynamic>> querySnapshot =
          await FirebaseFirestore.instance.collection('deliveryAgent').get();

      for (var queryDocumentSnapshot in querySnapshot.docs) {
        deliveryAgent.add(queryDocumentSnapshot.data()["deliveryAgent"]);
      }
    } catch (e) {
      if (kDebugMode) {
        print("error while getting delivery agent: $e");
      }
    }
    return deliveryAgent;
  }

  Future<bool> addDeliveryAgent(
      {required String orderId, required String deliveryAgent}) async {
    try {

      await testorders.doc(orderId).set({
        "deliveryAgent": deliveryAgent
      }, SetOptions(merge: true));

      return true;
    } catch (e) {
      if (kDebugMode) {
        print("error while assigning delivery agent: $e");
      }
    }
    return false;
  }
}

order_view.dart

import 'package:flutter/material.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import '../../services/firebase_database.dart';
import '../widgets/snack_bar.dart';
import 'client_address.dart';
import 'dashboard.dart';
import 'package:url_launcher/url_launcher.dart';

class OrderView extends StatefulWidget {
  final Map<String, dynamic> orderData;
  final List<String> deliveryAgent;

  const OrderView(
      {Key? key, required this.orderData, required this.deliveryAgent})
      : super(key: key);

  @override
  State<OrderView> createState() => _OrderViewState();
}

class _OrderViewState extends State<OrderView> {
  final FirebaseDatabase _database = FirebaseDatabase();
  int index = 0;
  num totalAmount = 0;
  Map<String, dynamic> clientData = {};

  getcountTotalAmount() async {
    for (var item in widget.orderData["orders"]) {
      totalAmount = totalAmount + (item["productPrice"] * item["amount"]);
    }
    clientData = (await _database.getClientData(widget.orderData["userId"]))!;
    setState(() {});
  }

  @override
  void initState() {
    getcountTotalAmount();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[200],
      appBar: AppBar(
        elevation: 4,
        title: const Text("Open Order"),
        actions: [
          TextButton(
            onPressed: () async {
              showDialog(
                  context: context,
                  builder: (context) {
                    return AlertDialog(
                      content: const Text(
                        "Are you sure you want to cancel this order?",
                        textAlign: TextAlign.center,
                      ),
                      actions: [
                        TextButton(
                            onPressed: () {
                              Navigator.pop(context);
                            },
                            child: const Text(
                              "No",
                              style:
                                  TextStyle(color: Colors.green, fontSize: 16),
                            )),
                        TextButton(
                            onPressed: () async {
                              // Navigator.pop(context);
                              showDialog(
                                  context: context,
                                  builder: (context) {
                                    return LoadingAnimationWidget.inkDrop(
                                      color: Colors.orange,
                                      size: 50,
                                    );
                                  });
                              await _database.removeOrder(
                                createTime: widget.orderData["createAt"],
                              );
                              Navigator.of(context).pop();
                              Navigator.of(context).pushAndRemoveUntil(
                                MaterialPageRoute(
                                    builder: (context) =>
                                        const AdminDashboard()),
                                ModalRoute.withName(''),
                              );

                              ScaffoldMessenger.of(context).showSnackBar(
                                snackBar(
                                    message: "Your order is removed",
                                    color: Colors.deepOrange),
                              );
                            },
                            child: const Text(
                              "Yes",
                              style: TextStyle(color: Colors.red, fontSize: 16),
                            )),
                      ],
                    );
                  });
            },
            child: const Text(
              "Cancel Order",
              style: TextStyle(
                color: Colors.red,
                fontWeight: FontWeight.w500,
                fontSize: 15,
              ),
            ),
          ),
        ],
      ),
      body: SizedBox(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
        child: ListView(
          physics: const BouncingScrollPhysics(),
          children: [
           
            Container(
                width: MediaQuery.of(context).size.width,
                color: Colors.white,
                padding: const EdgeInsets.only(bottom: 8),
                child: Column(
                  children: [
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        const Text(
                          "Delivery Agent",
                          style: TextStyle(
                            fontWeight: FontWeight.w500,
                            fontSize: 16,
                          ),
                        ),
                        DropdownButton(
                          items: widget.deliveryAgent
                              .map(
                                (e) => DropdownMenuItem(
                                  value: e,
                                  child: Text(e),
                                ),
                              )
                              .toList(),
                          onChanged: (val) {
                            setState(() {
                              index =
                                  widget.deliveryAgent.indexOf(val.toString());
                            });
                          },
                          isExpanded: false,
                          hint: Text(
                            widget.deliveryAgent[index],
                            style: const TextStyle(
                              fontWeight: FontWeight.w600,
                              fontSize: 15,
                            ),
                          ),
                        ),
                      ],
                    ),
                    ElevatedButton(
                        onPressed: () async {
                          bool results;
                          results = await _database.addDeliveryAgent(
                            orderId: widget.orderData["orderId"],
                              deliveryAgent: widget.deliveryAgent[index],
                          );
                        },
                        child: const Text('Assign Agent')),
                  ],
                )),
          ],
        ),
      ),
    );
  }
}
0 Answers
Related