You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:27:31