Flutter中如何仅显示当前用户的Firestore行程数据?
修复Flutter Firestore仅显示当前用户行程的问题
从你的代码和数据库截图来看,核心问题出在字段名大小写不匹配,同时还有一些可以优化的点,以下是具体修复步骤:
1. 修正Firestore查询的字段名
你的数据库里存储用户ID的字段是userId(首字母大写的I),但查询代码里写的是userid(全小写)。Firestore对字段名大小写敏感,这就导致你的过滤条件完全失效,返回了所有行程数据。
把查询中的"userid"改成"userId"即可:
.where("userId", isEqualTo: currentUser.uid)
2. 确保当前用户已正确获取
要保证user?.uid是有效的用户ID,建议直接通过FirebaseAuth.instance.currentUser获取当前登录用户,避免因user变量未初始化导致的空值问题:
final currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) { // 用户未登录,直接返回,避免无效查询 return; }
3. 优化查询的异步逻辑
原代码用then处理异步,且每次添加数据都调用setState,既不高效也容易引发状态异常。建议改用async/await,并一次性更新列表:
修改后的完整getTrip函数:
Future getTrip() async { // 先清空旧数据,避免重复加载 setState(() { trips.clear(); }); try { final currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) return; final querySnapshot = await FirebaseFirestore.instance .collection('trip') .where("userId", isEqualTo: currentUser.uid) .orderBy('date', descending: false) .orderBy('time', descending: false) .get(); // 批量处理数据 final newTrips = querySnapshot.docs.map((doc) => { 'dest': doc['destination'], 'desc': doc['description'], 'image': doc['image'], 'time': doc['time'], 'date': doc['date'], 'doc': doc.id, }).toList(); setState(() { trips = newTrips; }); } catch (e) { print('加载行程出错:$e'); // 这里可以添加错误提示,比如用Fluttertoast显示 } }
4. 配置Firestore安全规则(可选但推荐)
为了从根源上防止用户访问不属于自己的数据,建议配置Firestore安全规则,确保只有用户本人能读写自己的行程:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /trip/{tripId} { allow read, write: if request.auth != null && request.auth.uid == resource.data.userId; } } }
做完以上修改后,你的应用就只会加载当前登录用户的行程数据了。
内容的提问来源于stack exchange,提问作者Maisarah Mohamed
相关产品推荐
相关产品推荐

