You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Dismissible删除Firebase ListView项报documentID错误

问题背景

使用Dismissible组件实现Firebase数据库列表项滑动删除功能时,参考多份实现方案均运行失败,固定抛出指定错误,需要确认代码修改点。

相关代码

页面组件代码

class HomeScreenStreamBuilder extends StatelessWidget {
  const HomeScreenStreamBuilder({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: FirestoreMethods().readClipboardItems(),
      builder: ((context, AsyncSnapshot snapshot) {
        if (snapshot.hasData) {
          return ListView.builder(
            padding: const EdgeInsets.all(0),
            itemBuilder: ((context, index) {
              Map data = snapshot.data.docs[index].data();

              return Dismissible(
                  direction: DismissDirection.startToEnd,
                  onDismissed: (direction) {
                    FirestoreMethods()
                        .deleteClipboardItem(snapshot.data.docs.documentID);
                  },
                  key: ObjectKey(snapshot.data.docs.elementAt(index)),
                  child: ClipboardTile(text: data["text"]));
            }),
            itemCount: snapshot.data.docs.length,
          );
        } else {
          return Center(
            child: Text("Loading"),
          );
        }
      }),
    );
  }
}

Firebase操作方法代码

// 读取列表数据方法
Stream<QuerySnapshot> readClipboardItems() {
  return FirebaseFirestore.instance
      .collection("users")
      .doc(_userUid)
      .collection("clipboardItems")
      .orderBy("created", descending: true)
      .snapshots();
}

// 删除条目方法
Future deleteClipboardItem(String docId) async { 
  return await FirebaseFirestore.instance 
    .collection("users") 
    .doc(_userUid) 
    .collection("clipboardItems") 
    .doc(docId) 
    .delete() 
    .then((doc) => print("document deleted"), onError: (e) => print("Error updating document $e")); 
}
报错信息
Class 'List<_JsonQueryDocumentSnapshot>' has no instance getter 'documentID'.
Receiver: Instance(length:16) of '_GrowableList'
Tried calling: documentID
问题修复
  • 错误根因:snapshot.data.docs是所有文档快照组成的列表对象,本身不存在documentID属性,需要获取当前渲染项对应单个文档的ID才能传入删除方法;另外新版FlutterFire中文档ID的属性名为id,而非旧版本的documentID。
  • 修复步骤:
    1. 修改onDismissed回调中的删除逻辑,替换错误的ID获取代码:
    // 原错误代码
    // FirestoreMethods().deleteClipboardItem(snapshot.data.docs.documentID);
    // 替换为
    FirestoreMethods().deleteClipboardItem(snapshot.data.docs[index].id);
    
    1. (可选优化)将Dismissible的key替换为基于文档ID的ValueKey,比原有ObjectKey更稳定,避免列表滑动复用时出现状态错乱:
    // 原代码
    // key: ObjectKey(snapshot.data.docs.elementAt(index)),
    // 替换为
    key: ValueKey(snapshot.data.docs[index].id),
    

内容的提问来源于stack exchange,提问作者LinusM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:03:29