Flutter中Firebase展示当前用户帖子遇'docs'未定义报错求助
问题分析与解决方案
错误原因
你当前通过FirebaseFirestore.instance.collection('ADS').doc(uid).snapshots()获取的是单个文档快照(DocumentSnapshot),而docs是**查询快照(QuerySnapshot)**才有的属性(用于存储多个文档的结果),单个文档对象没有docs getter,这就是报错的核心原因。
两种解决方案(对应不同的Firebase数据结构)
场景1:用户帖子以子集合形式存储
如果你的ADS集合结构是ADS/{用户UID}/posts/{帖子文档}(每个用户的帖子存在专属子集合里),需要修改流的获取方式,监听子集合的查询结果:
class _MyRidesScreenState extends State<MyRidesScreen> { // 改为监听用户子集合的查询流 Stream<QuerySnapshot<Map<String, dynamic>>> myPosts = FirebaseFirestore .instance .collection('ADS') .doc(FirebaseAuth.instance.currentUser!.uid) .collection('posts') // 新增子集合路径 .snapshots(); @override Widget build(BuildContext context) { return StreamBuilder<QuerySnapshot<Map<String, dynamic>>>( stream: myPosts, builder: (BuildContext context, snapshot) { if (snapshot.hasError) { return const Center( child: Text( 'Error occured', style: TextStyle(fontSize: 20), )); } if (!snapshot.hasData || snapshot.data!.docs.isEmpty) { return const Center(child: Text('No requests yet')); } if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: Text("Loading")); } return ListView( children: snapshot.data!.docs.map((DocumentSnapshot document) { Map<String, dynamic> data = document.data()! as Map<String, dynamic>; return Card( child: ListTile( title: Text(data['title'] ?? 'No Title'), ), ); }).toList(), // 需转成List<Widget>类型 ); }); } }
场景2:用户帖子存储在单个文档的数组字段中
如果你的ADS集合中,每个用户的帖子是存储在**单个文档(ID为用户UID)**的数组字段里(比如文档内有posts数组),直接读取文档数据并遍历数组即可:
class _MyRidesScreenState extends State<MyRidesScreen> { Stream<DocumentSnapshot<Map<String, dynamic>>> myPosts = FirebaseFirestore .instance .collection('ADS') .doc(FirebaseAuth.instance.currentUser!.uid) .snapshots(); @override Widget build(BuildContext context) { return StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>( stream: myPosts, builder: (BuildContext context, snapshot) { if (snapshot.hasError) { return const Center( child: Text( 'Error occured', style: TextStyle(fontSize: 20), )); } if (!snapshot.hasData || snapshot.data!.data() == null) { return const Center(child: Text('No requests yet')); } if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: Text("Loading")); } Map<String, dynamic> data = snapshot.data!.data()! as Map<String, dynamic>; // 假设帖子存储在data['posts']数组中 List<dynamic> posts = data['posts'] ?? []; return ListView( children: posts.map((post) { return Card( child: ListTile( title: Text(post['title'] ?? 'No Title'), ), ); }).toList(), ); }); } }
内容的提问来源于stack exchange,提问作者Eben Oasis
相关产品推荐
相关产品推荐

