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

如何调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:30:50