Flutter中RefreshIndicator删除Firestore数据后列表未更新问题
问题根因
- 核心问题出在
getCollectionItems方法的setState触发逻辑:你仅在遍历splitCollection的循环内部执行setState更新列表数据,当你删除条目后,如果用户收藏的条目为空,splitCollection长度为0,循环不会执行,自然不会触发setState把itemsList更新为最新的空列表,旧数据一直保留在内存中,所以刷新后界面无变化。新增条目时splitCollection必然有内容,循环可以正常执行,所以新增逻辑没问题。 - 附加的不规范写法:
FutureBuilder绑定的userFuture仅在initState中初始化一次,虽然你当前靠getCollectionItems内部的setState更新状态可以触发重绘,但不符合FutureBuilder的设计使用规范。
修复方案
1. 重写getCollectionItems方法,统一处理数据更新逻辑
不管查询结果是否为空,都保证执行一次setState更新最新数据:
getCollectionItems() async { // 先声明临时变量存储查询结果,避免中途修改状态引发异常 List<CollectionItem> tempItems = []; int tempCount = 0; QuerySnapshot querySnapshot = await Firestore.instance .collection("users") .document(_userId) .collection("userCollection") .getDocuments(); List<Users> collectionID = []; for (DocumentSnapshot item in querySnapshot.documents) { var data = item.data; Users user = Users(); user.id = data["id"]; collectionID.add(user); } final collectionIDs = collectionID.map((doc) => doc.id).toList(); var splitCollection = partition<dynamic>(collectionIDs, 10); for (int i = 0; i < splitCollection.length; i++) { QuerySnapshot querySnapshotCollections = await Firestore.instance .collection('items') .where('itemId', whereIn: splitCollection.elementAt(i)) .orderBy('timestamp', descending: true) .getDocuments(); tempCount += querySnapshotCollections.documents.length; tempItems.addAll(querySnapshotCollections.documents .map((documentSnapshot) => CollectionItem.fromDocument(documentSnapshot)) .toList()); } // 统一执行一次状态更新,不管有没有数据都会刷新列表 setState(() { countItem = tempCount; itemsList = tempItems; userFuture = Future.value(); // 可选,同步更新FutureBuilder绑定的future值 }); }
2. 调整RefreshIndicator的onRefresh回调,保证加载状态正常收起
onRefresh: () async { await getCollectionItems(); return; }
修改完成后,删除条目后刷新会自动更新为最新的列表数据,无需重启页面。
内容的提问来源于stack exchange,提问作者TonyCrudor
相关产品推荐
相关产品推荐

