Flutter页面刷新后Firestore用户数据重复显示问题求助
解决Firestore同一用户数据重复显示问题
一、解决Firestore中重复创建用户数据的问题
当前代码每次点击按钮都会新增一条用户记录,未判断用户是否已存在。最稳妥的方式是用Firebase Auth的用户UID作为profiles集合的文档ID(每个用户UID唯一),确保同一用户仅存在一条数据:
- 修改
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)); }
- 调整按钮调用逻辑,等待注册完成后再创建用户数据:
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
相关产品推荐
相关产品推荐

