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

Flutter页面刷新后Firestore用户数据重复显示问题求助

解决Firestore同一用户数据重复显示问题

一、解决Firestore中重复创建用户数据的问题

当前代码每次点击按钮都会新增一条用户记录,未判断用户是否已存在。最稳妥的方式是用Firebase Auth的用户UID作为profiles集合的文档ID(每个用户UID唯一),确保同一用户仅存在一条数据:

  1. 修改createUser函数:
Future createUser(Profiles profile) async {
  final currentAuthUser = FirebaseAuth.instance.currentUser;
  if (currentAuthUser == null) return;
  
  // 用用户UID作为文档ID
  final docUser = FirebaseFirestore.instance.collection('profiles').doc(currentAuthUser.uid);
  profile.id = currentAuthUser.uid;
  final json = profile.toJson();
  // 可选:用merge参数避免覆盖已有数据,适合更新场景
  await docUser.set(json, SetOptions(merge: true));
}
  1. 调整按钮调用逻辑,等待注册完成后再创建用户数据:
LoginButton(
  onPressed: () async {
    await signUp(); // 等待注册流程完成
    final currentAuthUser = FirebaseAuth.instance.currentUser;
    if (currentAuthUser == null) return;
    
    final user = Profiles(
      id: currentAuthUser.uid,
      email: currentAuthUser.email ?? email.text.trim(),
      gender: selectedGender == 1 ? 'Erkek' : 'Kadın',
      name: name.text.trim(),
      username: username.text.trim()
    );
    createUser(user);
  },
)

二、解决页面刷新后列表重复显示的问题

当前getDocId函数未清空列表就追加数据,导致多次调用后docIDs重复。修改函数逻辑:

List<String> docIDs = [];

getDocId() async {
  docIDs.clear(); // 每次查询前清空列表
  final currentAuthUser = FirebaseAuth.instance.currentUser;
  if (currentAuthUser == null) return;
  
  final snapshot = await FirebaseFirestore.instance
      .collection('profiles')
      .where('email', isEqualTo: currentAuthUser.email)
      .get();
  
  snapshot.docs.forEach((element) {
    docIDs.add(element.reference.id);
  });
}

额外优化:避免FutureBuilder重复触发查询

将查询逻辑移到initState中,只执行一次:

late final Future<void> _fetchDocIds;

@override
void initState() {
  super.initState();
  _fetchDocIds = getDocId(); // 存储Future对象,防止重建重复调用
}

// 使用时替换原FutureBuilder的future参数
FutureBuilder(
  future: _fetchDocIds,
  builder: (context, snapshot) {
    // 原有列表构建逻辑
  },
)

补充优化:通过UID直接查询数据

如果已经用UID作为文档ID,可跳过邮箱过滤,直接通过UID获取数据,效率更高:

getDocId() async {
  docIDs.clear();
  final currentAuthUser = FirebaseAuth.instance.currentUser;
  if (currentAuthUser != null) {
    docIDs.add(currentAuthUser.uid);
  }
}

内容的提问来源于stack exchange,提问作者KKot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:05:04