Flutter结合Firestore如何获取其他用户UID实现好友申请功能
Flutter点击用户列表项获取目标用户UID实现好友申请方案
核心逻辑
Firestore集合查询返回的每一条文档快照(QueryDocumentSnapshot)自带id属性,对应用户文档在users集合中的唯一ID(也就是用户UID),构建列表项时通过索引定位到当前条目对应的文档,直接读取id属性就能拿到点击项的用户UID,不需要额外在文档字段中冗余存储UID。
实现步骤
- 在
ListView.builder的itemBuilder作用域内提前缓存当前索引对应的用户文档对象,避免重复书写snapshot.data?.docs[index],同时方便读取文档ID和内置字段 - 好友申请发送方UID直接从Firebase Auth的当前登录用户实例获取,不需要额外查询数据库
- 写入
friendships集合时增加申请状态字段,区分待确认、已接受、已拒绝的关系状态,避免重复申请、方便后续好友关系校验
参考代码
// 需提前引入firebase_auth依赖获取登录态 import 'package:firebase_auth/firebase_auth.dart'; Widget build(BuildContext context) { // 缓存当前登录用户(申请发送方) final currentUser = FirebaseAuth.instance.currentUser; return Scaffold( appBar: AppBar( title: const Text('Home'), elevation: 0, ), body: Container( child: StreamBuilder( stream: FirebaseFirestore.instance.collection('users').snapshots(), builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasData) { return ListView.builder( itemCount: snapshot.data?.docs.length, itemBuilder: (context, index) { // 缓存当前条目对应的用户文档 final userDoc = snapshot.data?.docs[index]; // 直接取文档id即为接收方用户UID final receiverUid = userDoc?.id; return Padding( padding: const EdgeInsets.all(5.0), child: ListTile( shape: RoundedRectangleBorder( side: const BorderSide(color: Colors.grey), borderRadius: BorderRadius.circular(5), ), leading: const CircleAvatar(backgroundColor: Colors.lightBlue), title: Text("${userDoc?['firstname']} ${userDoc?['lastname']}"), subtitle: Text(userDoc?['email'] ?? ''), trailing: const Icon(Icons.keyboard_arrow_right, color: Colors.grey), onTap: () async { // 异常拦截:未登录、点击条目为自己、用户文档为空时直接返回 if (currentUser == null || receiverUid == null || currentUser.uid == receiverUid) { return; } // 写入好友申请记录 await FirebaseFirestore.instance.collection('friendships').add({ 'senderUid': currentUser.uid, 'receiverUid': receiverUid, 'status': 'pending', 'createTime': FieldValue.serverTimestamp(), }); // 此处可追加申请发送成功的提示逻辑 }, ), ); }, ); } // 加载状态替代原空白容器,体验更友好 return const Center(child: CircularProgressIndicator()); }, ), ), ); }
优化注意点
- 写入申请前建议先查询
friendships集合,判断是否已存在相同发送方、接收方的pending状态申请,避免重复发送 - 好友申请通过后将对应记录的
status字段更新为accepted,查询好友列表时直接过滤该状态的记录即可 - 可给
friendships集合配置senderUid、receiverUid、status的组合索引,提升好友关系查询速度
内容的提问来源于stack exchange,提问作者superboy3601
相关产品推荐
相关产品推荐

