如何配置Flutter注册流程 实现Firebase同一文档存储手机号与用户补充信息
问题根源
你当前使用的CollectionReference.add()方法的作用是每次调用都在users集合下生成一个全新的自动生成ID的文档,所以才会出现手机号和补充信息分散在两个独立文档的情况。你需要定位到存储手机号的对应文档,调用更新/合并数据的接口,而非新增文档。
解决步骤
统一用Firebase Auth生成的用户UID作为文档ID
每个通过手机号认证登录的用户,在Firebase Auth体系中都有唯一的固定UID,你在首次存储用户手机号的时候,就应该用这个UID作为users集合下对应文档的ID,不要使用Firebase自动生成的随机ID,方便后续定位到同一用户的文档做更新。
示例代码(首次存储手机号的逻辑):import 'package:firebase_auth/firebase_auth.dart'; final User? currentUser = FirebaseAuth.instance.currentUser; // 未登录时做跳转等异常处理 if (currentUser == null) return; final String uid = currentUser.uid; CollectionReference users = FirebaseFirestore.instance.collection("users"); // 存储手机号时指定文档ID为用户UID await users.doc(uid).set({ 'phone': currentUser.phoneNumber, // 其他初始字段 });修改补充信息提交逻辑,替换
add()为合并更新接口
提交补充信息时,先用当前登录用户的UID定位到对应文档,使用带merge: true参数的set()方法,该方法会在已有文档基础上合并新字段,不会覆盖原有数据,也不会生成新文档。
你原来的按钮点击逻辑修改后如下:SizedBox( width: 320, child: ElevatedButton( onPressed: () async { final User? currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) return; final String uid = currentUser.uid; await users.doc(uid).set({ 'name': textNote, 'company name': companyName, }, SetOptions(merge: true)).then((value) => print('用户信息更新成功')); }, child: const Text( "SEND", style: TextStyle( color: Colors.white, ), ), ), )注意:如果确定文档一定存在,也可以用
update()方法替代带merge的set()方法,update()在目标文档不存在时会抛出异常,set(merge: true)则不存在时会自动创建文档,兼容性更好。
内容的提问来源于stack exchange,提问作者Vishal Patil
相关产品推荐
相关产品推荐

