Flutter 删除firestore表中的映射

Flutter 删除firestore表中的映射,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,在Firestore中删除数据表中的地图时遇到问题。实际上,我要么删除整个数组,要么收到以下类型的错误: 颤振:未能删除1:无效参数:“\u CompactLinkedHashSet”的实例 我附上我的课程给你,以便你能更好地理解。提前谢谢你 类删除\u说明: import 'package:cloud_firestore/cloud_firestore.dart'; class DeleteDescription { final String city; final String c

在Firestore中删除数据表中的地图时遇到问题。实际上,我要么删除整个数组,要么收到以下类型的错误:

颤振:未能删除1:无效参数:“\u CompactLinkedHashSet”的实例

我附上我的课程给你,以便你能更好地理解。提前谢谢你

类删除\u说明:

import 'package:cloud_firestore/cloud_firestore.dart';

class DeleteDescription {
  final String city;
  final String citee;
  final int value;
  CollectionReference cities = FirebaseFirestore.instance.collection('city');

  DeleteDescription(this.city, this.citee, this.value) {
    deleteDescription();
  }

  Future<void> deleteDescription() {
    return cities
        .doc(city)
        .collection("citee")
        .doc(citee)
        .set({
          "Description": FieldValue.arrayRemove([
            {0}
          ])
        })
        .then((value) => print("$citee Deleted"))
        .catchError((error) => print("Failed to delete $value: $error"));
  }
}
import'包:cloud_firestore/cloud_firestore.dart';
类删除描述{
最后的字符串城市;
最终字符串citee;
最终整数值;
CollectionReference cities=FirebaseFirestore.instance.collection('city');
DeleteDescription(this.city,this.citee,this.value){
删除描述();
}
未来删除说明(){
回归城市
博士(城市)
.收款(“citee”)
博士(citee)
.设置({
“说明”:FieldValue.arrayRemove([
{0}
])
})
。然后((值)=>打印($citee已删除”))
.catchError((error)=>print(“未能删除$value:$error”);
}
}
类别说明:

import 'package:ampc_93/fonction/firebase_crud/delete_description.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class ReadDescription extends StatefulWidget {
  final String titreCity;
  final String titreCitee;

  ReadDescription(this.titreCity, this.titreCitee);

  @override
  _ReadDescriptionState createState() => _ReadDescriptionState();
}

class _ReadDescriptionState extends State<ReadDescription> {
  @override
  Widget build(BuildContext context) {
    CollectionReference cities = FirebaseFirestore.instance.collection("city");
    return FutureBuilder<DocumentSnapshot>(
      future: cities
          .doc(widget.titreCity)
          .collection("citee")
          .doc(widget.titreCitee)
          .get(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Text("Something went wrong");
        }
        if (snapshot.hasData && !snapshot.data!.exists) {
          return Text("Documents does not exist");
        }
        if (snapshot.connectionState == ConnectionState.done) {
          var data = snapshot.data!.data() as Map<String, dynamic>;
          if (data["Description"] == null) {
            return Text("");
          } else {
            return ListView.separated(
                itemBuilder: (context, index) {
                  return ListTile(
                      title: Text(
                        data["Description"][index]["Identite"],
                        textAlign: TextAlign.justify,
                      ),
                      subtitle: Text(
                        data["Description"][index]["Role"],
                        textAlign: TextAlign.justify,
                        style: TextStyle(
                            decoration: TextDecoration.underline,
                            color: Colors.red),
                      ),
                      leading: Icon(Icons.person),
                      trailing: IconButton(
                        onPressed: () => DeleteDescription(
                            widget.titreCity, widget.titreCitee, index),
                        icon: Icon(Icons.delete_forever),
                        color: Colors.red[300],
                      ));
                },
                separatorBuilder: (context, index) => Divider(),
                itemCount: data["Description"].length);
          }
        }
        return Text("Loading");
      },
    );
  }
}
import'程序包:ampc_93/fonction/firebase_crud/delete_description.dart';
导入“包:cloud_firestore/cloud_firestore.dart”;
进口“包装:颤振/材料.省道”;
类ReadDescription扩展了StatefulWidget{
最后的弦乐练习;
最后的弦乐演奏者;
ReadDescription(this.titready,this.titreadee);
@凌驾
_ReadDescriptionState createState()=>\u ReadDescriptionState();
}
类_ReadDescriptionState扩展状态{
@凌驾
小部件构建(构建上下文){
CollectionReference cities=FirebaseFirestore.instance.collection(“城市”);
回归未来建设者(
未来:城市
.doc(widget.tity)
.收款(“citee”)
.doc(widget.titree)
.get(),
生成器:(上下文,快照){
if(snapshot.hasError){
返回文本(“出错”);
}
如果(snapshot.hasData&!snapshot.data!。存在){
返回文本(“文件不存在”);
}
if(snapshot.connectionState==connectionState.done){
var data=snapshot.data!.data()作为映射;
如果(数据[“说明”]==null){
返回文本(“”);
}否则{
返回ListView.separated(
itemBuilder:(上下文,索引){
返回列表块(
标题:正文(
数据[“说明”][索引][“标识”],
textAlign:textAlign.justify,
),
字幕:文本(
数据[“说明”][索引][“角色”],
textAlign:textAlign.justify,
样式:TextStyle(
装饰:textEdition.underline,
颜色:颜色。红色),
),
引导:图标(Icons.person),
尾随:图标按钮(
onPressed:()=>DeleteDescription(
widget.titready,widget.titreadee,index),
图标:图标(图标。永远删除),
颜色:颜色。红色[300],
));
},
separatorBuilder:(上下文,索引)=>Divider(),
itemCount:数据[“说明”]。长度);
}
}
返回文本(“加载”);
},
);
}
}
我指定在我的数据库中,“Description”是一个数组,因此我希望删除“Description”编号为0的所有元素


您正在使用的
字段值.arrayRemove
不能以这种方式工作。有两种方法可以从firestore列表中删除数据。 第一种方法是在
FieldValue.arrayRemove
中传递要删除的元素(而不是它的索引)。 第二种方法是从firestore获取集合,根据需要修改数据,并在firestore中更新集合。 请查看下面的代码以了解更多信息

import 'package:cloud_firestore/cloud_firestore.dart';

class DeleteDescription {
  final String city;
  final String citee;
  final int value;
  CollectionReference cities = FirebaseFirestore.instance.collection('city');

  DeleteDescription(this.city, this.citee, this.value) {
    deleteDescription();
  }

  Future<void> deleteDescription() {
   final snapshot = await cities.doc(city).collection("citee").doc(citee).get();
  
  /* Get list from firestore */
  final list = snapshot["Description"] as List;
 
  /* Remove first or any element and delete from list */
  list.removeAt(0);
  
  /* Update same list in firestore*/
  await cities
    .doc(city)
    .collection("citee")
    .doc(citee)
      .set({"Description": list}).then((value) => print(" Deleted"));

   
  }
}
import'包:cloud_firestore/cloud_firestore.dart';
类删除描述{
最后的字符串城市;
最终字符串citee;
最终整数值;
CollectionReference cities=FirebaseFirestore.instance.collection('city');
DeleteDescription(this.city,this.citee,this.value){
删除描述();
}
未来删除说明(){
最终快照=wait cities.doc(city.collection)(“citee”).doc(citee.get();
/*从firestore获取列表*/
最终列表=快照[“说明”]作为列表;
/*删除第一个或任何元素并从列表中删除*/
移除列表(0);
/*更新firestore中的相同列表*/
等待城市
博士(城市)
.收款(“citee”)
博士(citee)
.set({“Description”:list})。然后((值)=>打印(“已删除”);
}
}

一个考虑FixStals'数组的有用的方法是,它们是<强>绝对不是数组< /强> -它们是有序列表(按它们添加到数组中的顺序排序,或者它们以数组的形式传递到API中的顺序),并且所示的“数字”是顺序,而不是索引。“识别”Firestore数组[ordered list]中单个元素的唯一方法是通过其精确完整的值。很不幸,他们选择了“数组”这个名字

也就是说,当您阅读文档时,呈现给代码的结果以数组的形式出现,并获得按索引引用元素的能力-这就是为什么您必须:

=>在后端/API调用中,通过“value”指定一个元素,在本例中,它是列表上的整个对象


=>在客户端,读取文档,通过索引或值删除所需元素,然后将整个数组写回后端。

@L'Alphamerc另一方面,由于它是一个异步函数,我无法再使用“Setstate”更新列表,我必须返回并返回pag