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。 - 修复步骤:
- 修改
onDismissed回调中的删除逻辑,替换错误的ID获取代码:
// 原错误代码 // FirestoreMethods().deleteClipboardItem(snapshot.data.docs.documentID); // 替换为 FirestoreMethods().deleteClipboardItem(snapshot.data.docs[index].id);- (可选优化)将Dismissible的key替换为基于文档ID的ValueKey,比原有ObjectKey更稳定,避免列表滑动复用时出现状态错乱:
// 原代码 // key: ObjectKey(snapshot.data.docs.elementAt(index)), // 替换为 key: ValueKey(snapshot.data.docs[index].id), - 修改
内容的提问来源于stack exchange,提问作者LinusM
相关产品推荐
相关产品推荐

