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

Jetpack Compose(Android Studio)中Firebase用户ID始终返回null的问题

问题原因与解决方案

核心问题

你在调用createUser时,要么是在用户注册完成前就执行了该方法(此时FirebaseAuth.currentUser还未被初始化,导致ID为null),要么是手动传入的id参数并非正确的当前用户UID。同时代码存在参数冗余和潜在的空值处理问题。

具体修复步骤

1. 移除createUser方法的冗余id参数

不需要手动传入用户ID,直接在Repository内部获取已注册用户的UID,避免手动传参导致的错误:

修改AuthRepository接口:

interface AuthRepository {
    // ... 其他方法保持不变
    // 移除id参数
    suspend fun createUser(email: String, password: String, code: String): Resource<FirebaseFirestore>
}

修改AuthRepositoryIMPL的createUser实现:

override suspend fun createUser(
    email: String,
    password: String,
    code: String
): Resource<FirebaseFirestore> {
    return try {
        // 直接从currentUser获取UID,确保只有注册成功后才会调用此方法
        val userId = currentUser?.uid ?: throw IllegalStateException("用户未完成注册,无法获取UID")
        val user = mutableMapOf<String, Any>(
            "user_id" to userId,
            "user_email" to email,
            "user_code" to code
        )

        val result = firebaseDB.collection("users").add(user).await()
        Resource.Succes(result.firestore)
    } catch (ex: Exception) {
        ex.printStackTrace()
        Resource.Failure(ex)
    }
}

2. 修正getUserId的空值处理逻辑

原代码中currentUser?.uid.toString().orEmpty()会在currentUser为null时返回字符串"null",而非空字符串,这会导致错误的ID存入Firestore。修改为:

override val getUserId: String
    get() = currentUser?.uid.orEmpty()

3. 确保createUser在注册成功后调用

在ViewModel中,需要监听signUpFlow的状态,只有当注册成功(Resource.Success)时,再调用createUser,避免提前执行导致UID为null:

修改ViewModel中的调用逻辑:

// 先完成注册,再创建Firestore文档
fun signUpAndCreateUser(email: String, password: String, code: String) = viewModelScope.launch {
    _signUpFlow.value = Resource.Loading
    val signUpResult = repository.signUpUser(email, password)
    _signUpFlow.value = signUpResult

    // 只有注册成功时,才创建Firestore用户文档
    if (signUpResult is Resource.Succes) {
        _createUserFlow.value = Resource.Loading
        val createResult = repository.createUser(email, password, code)
        _createUserFlow.value = createResult
    }
}

同时更新ViewModel中的createUser方法:

fun createUser(email: String,password: String,code: String)
    =viewModelScope.launch{
        _createUserFlow.value=Resource.Loading
        val result = repository.createUser(email,password, code)
        _createUserFlow.value=result
    }

4. 重要安全提醒

你的代码中直接将用户密码存入Firestore,这是严重的安全问题。Firebase Auth已经负责密码管理,永远不要在数据库中存储明文密码,请从userMap中移除"user_password"字段。

额外检查点

确认你的signUpUser方法正确实现了Firebase注册逻辑,确保注册成功后FirebaseAuth.currentUser被正确初始化:

// AuthRepositoryIMPL中的signUpUser示例实现
override suspend fun signUpUser(email: String, password: String): Resource<FirebaseUser> {
    return try {
        val result = firebaseAuth.createUserWithEmailAndPassword(email, password).await()
        Resource.Succes(result.user!!)
    } catch (ex: Exception) {
        ex.printStackTrace()
        Resource.Failure(ex)
    }
}

内容的提问来源于stack exchange,提问作者Mihneas22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:56:26