createUserWithEmailAndPassword后updateDisplayName()不生效
问题根因
这是Firebase Auth的实例缓存特性导致的,和空值无关:
createUserWithEmailAndPassword返回的User是返回时刻的静态快照,不会自动同步后续的属性修改updateDisplayName仅会把修改提交到Firebase服务端,不会更新你本地代码里已经持有的旧user变量的属性值- 即使调用
reload()方法,原有user变量指向的实例也不会自动刷新属性,必须重新从认证实例拉取当前用户,才能拿到更新后的displayName - 你当前代码直接用更新前的旧
user实例做转换、入库,读到的displayName本来就是null,写入Firestore自然为空。
修复代码
更新displayName后重新拉取最新的用户实例,再执行后续逻辑即可:
Future regEmailPass(String email, String password, String? username) async { try { UserCredential result = await _auth.createUserWithEmailAndPassword( email: email, password: password); User? user = result.user; // 提交displayName更新 await user?.updateDisplayName(username); // 刷新认证状态,拉取最新用户实例 await _auth.currentUser?.reload(); final User? latestUser = _auth.currentUser; // 用最新实例做业务转换 UserInApp? userInApp = _userFromFireBaseUser(latestUser); await DatabaseService(user: userInApp).firstTimeCreateDB(username!); return userInApp; } catch (e) { print(e.toString()); return null; } }
补充说明
- 如果
username存在传入null的可能,不要在入库时直接使用username!非空断言,提前做参数校验避免运行时报错 - 只要你传入
_userFromFireBaseUser的是重新拉取的latestUser实例,就能正常读取到更新后的displayName值,写入Firestore不会再出现null的问题。
内容的提问来源于stack exchange,提问作者User1000132123
相关产品推荐
相关产品推荐

