如何调用createUserWithEmailAndPassword后获取UID并初始化UserProfile
实现方案
核心要解决异步操作的顺序问题:必须等用户创建成功拿到UID后,再完成赋值并执行添加用户的操作,所以所有后续逻辑都要放在创建用户的协程内部执行。
修改后的ViewModel代码
fun createUserWithEmailAndPassword(email: String, password: String, user: UserProfile) { viewModelScope.launch(Dispatchers.IO) { // 执行邮箱密码创建用户操作,等待结果返回 val authResult = auth.createUserWithEmailAndPassword(email, password).await() // 从认证结果中提取用户UID,做非空校验避免异常 val userId = authResult.user?.uid ?: throw IllegalArgumentException("创建用户失败,未获取到有效UID") // 给UserProfile对象赋值UID user.userID = userId // 调用添加用户到数据库的方法 addUser(user) } } // 优化addUser方法,直接调用仓库挂起函数,减少协程嵌套 suspend fun addUser(user: UserProfile) { UserRepository.addUser(user) }
关键说明
- 所有依赖用户创建结果的逻辑(赋值UID、调用
addUser)必须放在viewModelScope.launch的协程块内,否则会因为异步操作的时序问题,导致还没拿到UID就执行后续代码。 - 通过
authResult.user?.uid获取Firebase返回的用户唯一标识,这里增加了非空判断,避免创建用户异常时出现空指针问题。 - 把
addUser改为挂起函数,直接调用仓库的挂起方法,避免在协程内再启动新协程,让代码逻辑更清晰。
仓库代码保持不变
private val usersDocumentRef by lazy { UserRepository.db.collection("usersProfiles") } suspend fun addUser(user: UserProfile) { usersDocumentRef.document(user.userID).set(user).await() }
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

