Flutter中StreamBuilder内调用contains方法报空指针错误求助
错误原因
- 部分帖子的Firestore文档不存在
hidingUserId字段,读取该字段得到null值后调用contains方法直接触发空指针错误 - Dart语言中
List.removeWhere返回值为void,你原代码中链式调用.toList()的写法本身也会触发异常:removeWhere是直接修改原列表的可变方法,不会返回新列表,过滤生成新列表应该使用where方法。
修复代码(客户端过滤方案)
return StreamBuilder( stream: postRef.snapshots(), builder: (context, snapshot) { if (snapshot.hasData) { // 提前获取当前用户UID,同时处理未登录的边界情况 final currentUid = FirebaseAuth.instance.currentUser?.uid; if (currentUid == null) { // 未登录时的逻辑可按自己的业务需求调整,示例直接返回全部帖子 final documents = snapshot.data.docs; // 后续列表处理逻辑 } // 用where过滤符合要求的帖子 final documents = snapshot.data.docs.where((doc) { final hidingUserIdList = doc.data()['hidingUserId']; // 字段不存在/不是数组类型的帖子,默认没有被隐藏,直接保留 if (hidingUserIdList is! List) return true; // 仅保留当前用户不在隐藏列表中的帖子 return !hidingUserIdList.contains(currentUid); }).toList(); if (documents.isEmpty) { // 空列表对应的业务逻辑 } // 后续列表渲染逻辑 } // 补充加载中、请求错误的对应处理逻辑 } );
更优方案(服务端过滤)
如果数据量较大,建议直接在Firestore查询阶段就完成过滤,无需客户端二次处理,既节省带宽也提升性能:
// 构造查询时直接添加数组不包含的过滤条件 final currentUid = FirebaseAuth.instance.currentUser?.uid; final postRef = FirebaseFirestore.instance .collection('你的帖子集合名') .where('hidingUserId', arrayDoesNotContain: currentUid);
内容的提问来源于stack exchange,提问作者HaKim
相关产品推荐
相关产品推荐

