【问题标题】:Deleting Firestore Data in Flutter List View在 Flutter 列表视图中删除 Firestore 数据
【发布时间】:2021-05-03 15:54:11
【问题描述】:

我有一个从 Firestore 获取一些数据的常规列表视图,下面是它的代码:

body: StreamBuilder(
      stream: FirebaseFirestore.instance.collection('orders').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData)
          return Center(
            child:
                CircularProgressIndicator(), 
          );
        return ListView.builder(
       
          itemCount: snapshot.data.docs.length,
          itemBuilder: (context, index) {
            DocumentSnapshot ds = snapshot.data.docs[index];
  
            return Text(ds['name']);

现在,如果我想在其中的某处创建一个删除按钮,我会这样做:

FirebaseFirestore.instance.collection('orders').doc('ID SHOULD BE HERE').delete();

我遇到的问题是如何在此处找到列表磁贴的文档 ID,以便自动将其从数据库中删除?代码中的ID应该在这里应该是一些命令来找到它的ID,如下面的截图所示:

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    DocumentSnapshot 包含一个名为 id 的属性,它将返回此快照的文档给定 ID。因此,您可以执行以下操作:

    itemBuilder: (context, index) {
      DocumentSnapshot ds = snapshot.data.docs[index];
      print(ds.id);
      return Text(ds['name']);
    

    然后根据id删除它,执行以下操作:

    FirebaseFirestore.instance.collection('orders').doc(ds.id).delete();
    

    【讨论】:

    • 那我要这样删除吗? FirebaseFirestore.instance.collection('orders').doc('ds['id']').delete();
    • FirebaseFirestore.instance.collection('orders').doc(ds.id).delete();
    【解决方案2】:

    通过将 doc 中的参考 id 保存在本地模型中,并在所需的操作集上使用参考 id

    我已经提供了删除数据的实时示例。

    class Employee {
      Employee(this.employeeID, this.employeeName, this.branch, this.designation, this.location,
          this.salary,
          {this.reference});
    
      double employeeID;
    
      String employeeName;
    
      String designation;
    
      String branch;
    
      String location;
    
      double salary;
    
      DocumentReference reference;
    
      factory Employee.fromSnapshot(DocumentSnapshot snapshot) {
        Employee newEmployee = Employee.fromJson(snapshot.data());
        newEmployee.reference = snapshot.reference;
        return newEmployee;
      }
    
      factory Employee.fromJson(Map<String, dynamic> json) =>
          _employeeFromJson(json);
    
      Map<String, dynamic> toJson() => _employeeToJson(this);
    
      @override
      String toString() => 'employeeName ${employeeName}';
    }
    
    Employee _employeeFromJson(Map<String, dynamic> data) {
      return Employee(
        data['employeeID'],
        data['employeeName'],
        data['branch'],
        data['designation'],
        data['location'],
        data['salary'],
      );
    }
    
    Map<String, dynamic> _employeeToJson(Employee instance) {
      return {
        'employeeID' : instance.employeeID,
        'employeeName': instance.employeeName,
        'branch': instance.branch,
        'designation': instance.designation,
        'location': instance.location,
        'salary': instance.salary,
      };
    }
    

    存储库

    class EmployeeRepository{
      List<Employee> employees = [];
    
      final CollectionReference collection =
          FirebaseFirestore.instance.collection('employees');
    
      Stream<QuerySnapshot> getStream() {
        return collection.snapshots();
      }
      
      Future<DocumentReference> add(Employee employee) {
        var documentReference = collection.add(employee.toJson());
        return documentReference;
      }
    
      update(Employee employee) async {
        collection.doc(employee.reference.id).update(employee.toJson());
      }
    
    
      delete(Employee employee) async {
        collection.doc(employee.reference.id).delete();
      }
    
      fromSnapShot(DocumentSnapshot snapshot) => Employee.fromSnapshot(snapshot);
    
      Future<void> buildData(AsyncSnapshot snapshot) async {
        if (snapshot.data.documents.length == 0) {
          employees = [];
        }
    
        employees = await snapshot.data.documents.map<Employee>((doc) {
          return Employee.fromSnapshot(doc);
        }).toList(growable: false);
      }
    }
    

    列表视图构建器

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Employees List'),
        ),
        body: Column(children: [
          StreamBuilder<QuerySnapshot>(
              stream: employeeRepository.getStream(),
              builder: (context, snapShot) {
                if (!snapShot.hasData ||
                    snapShot.hasError ||
                    snapShot.connectionState == ConnectionState.waiting) {
                  return Container(
                    child: Center(child: CircularProgressIndicator()),
                  );
                }
                
                  employeeRepository.buildData(snapShot);
                  return ListView.builder(
                    itemBuilder: (context, index) {
                      final employee = employeeRepository.employees[index];
                      return ListTile(
                        title: Text(employee.employeeName),
                        onLongPress: () {
                          showDialog<AlertDialog>(
                              context: context,
                              builder: (context) {
                                return AlertDialog(
                                  actions: [
                                    FlatButton(
                                        onPressed: () {},
                                        child: Text('Edit')),
                                    FlatButton(
                                        onPressed: () {
                                          setState(() {
                                            employeeRepository
                                                .delete(employee);
                                            Navigator.pop(context);
                                          });
                                        },
                                        child: Text('Delete')),
                                  ],
                                  content: Text(employee.employeeName),
                                );
                              });
                        },
                      );
                    },
                  );
              }),
        ]),
      );
    }
    

    CRUD Operation in firestore

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2019-09-18
      • 2021-03-29
      • 2021-05-05
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2021-07-24
      相关资源
      最近更新 更多