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
相关产品推荐
相关产品推荐

