Flutter与Firebase基础结构问题:如何仅获取当前用户数据
解决Firestore仅获取当前用户单个文档的问题
我来帮你理清这个问题的核心——你其实是卡在了集合快照和单个文档快照的处理逻辑差异上,咱们一步步来调整:
问题根源
你之前用的stream: Firestore.instance.collection('stores').snapshots()返回的是QuerySnapshot(集合下所有文档的快照),所以代码里能通过snapshot.data.documents遍历所有文档;但改成collection('stores').document(uid).snapshots()后,返回的是DocumentSnapshot(单个用户文档的快照),它并没有documents数组,原来的ListView遍历逻辑自然会报错。
具体解决方案
1. 保留正确的Stream数据源
你修改后的stream方向是对的,就指向当前用户的单个文档:
stream: Firestore.instance.collection('stores').document(uid).snapshots(),
2. 调整StreamBuilder的处理逻辑
现在拿到的是单个文档快照,不需要再用ListView.builder遍历多个文档了,直接处理这个文档的数据即可。如果想保留ListView的布局结构,也可以改成单个item的列表:
方案一:直接返回单个组件(更简洁)
StreamBuilder( stream: Firestore.instance.collection('stores').document(uid).snapshots(), builder: (context, snapshot) { // 先判断快照是否加载完成 if (!snapshot.hasData) { return Center(child: CircularProgressIndicator()); } // 获取当前用户的店铺文档 DocumentSnapshot userStoreDoc = snapshot.data; return _buildStoreRow(context, userStoreDoc); }, )
方案二:保留ListView结构(适配原有布局)
StreamBuilder( stream: Firestore.instance.collection('stores').document(uid).snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return Center(child: CircularProgressIndicator()); } // 因为只有一个文档,itemCount设为1 return ListView.builder( itemExtent: 500, itemCount: 1, itemBuilder: (context, index) => _buildStoreRow(context, snapshot.data), ); }, )
3. 修正文档字段的引用方式
你的_buildListRows(建议改名为_buildStoreRow更贴合语义)方法里,直接用传入的DocumentSnapshot对象取字段就行,不需要再通过documents[index]:
Widget _buildStoreRow(BuildContext context, DocumentSnapshot document) { // 初始化控制器时可以直接赋值文档里的店铺名 _storeNameController.text = document['store_name'] ?? ''; ... Container( child: TextField( controller: _storeNameController, decoration: InputDecoration( border: OutlineInputBorder(), hintText: document['store_name'], ), ), ), ... }
额外提醒
- 要确保
uid是当前已登录用户的ID,比如通过FirebaseAuth.instance.currentUser?.uid获取,避免出现找不到文档的情况。 - 如果你的
stores集合下每个用户文档里还有子集合,那需要另做处理,但从你的描述看,每个用户对应一个独立文档,上面的方案完全适用。
内容的提问来源于stack exchange,提问作者Bisclavret
相关产品推荐
相关产品推荐

