使用Firebase实现Google登录Activity时出现4处错误求解决
错误修复方案
4个错误的具体修复如下:
- 错误1:变量重名导致未初始化异常
在firebaseAuthWithGoogle方法中,声明的局部变量auth和全局的FirebaseAuth实例auth重名,代码执行时会优先调用还未完成赋值的局部变量,直接触发报错。
修复代码:
// 替换原有val auth = auth.signInWithCredential(credential).await()行 val authResult = auth.signInWithCredential(credential).await() val firebaseUser = authResult.user
- 错误2:空安全调用缺失导致空指针风险
构造User实例时,firebaseUser.photoUrl可能为null,直接调用toString()会触发空指针异常,同时User类第三个参数imageUrl是不可空String类型,需要补充空处理逻辑。
修复代码:
val user = User( uid = firebaseUser.uid, displayName = firebaseUser.displayName, imageUrl = firebaseUser.photoUrl?.toString() ?: "" )
- 错误3:Firestore异步任务未正确配合协程使用
UserDao的addUser方法中,直接调用usersCollection.document(user.uid).set(it)返回的是Task对象,没有配合协程调用await(),任务执行状态无法追踪,也可能出现内存泄漏问题。
修复代码:
GlobalScope.launch(Dispatchers.IO) { usersCollection.document(user.uid).set(it).await() }
补充说明:生产环境不推荐直接使用GlobalScope,建议替换为lifecycleScope(Activity场景)或者viewModelScope,避免页面销毁后后台任务仍在执行导致内存泄漏。
- 错误4:
startActivityForResult方法已废弃
当前使用的startActivityForResult在新版AndroidX库中已被官方废弃,建议替换为Activity Result API实现:
首先在Activity中声明启动器:
private val signInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val task = GoogleSignIn.getSignedInAccountFromIntent(result.data) handleSignInResult(task) } }
再修改signIn方法:
private fun signIn() { val signInIntent = googleSignInClient.signInIntent signInLauncher.launch(signInIntent) }
修改完成后可以删除原来的onActivityResult重写代码。
额外校验项
- 确认Firebase控制台已经正确配置应用SHA-1签名、开启了Google登录授权,且已下载最新的
google-services.json放到项目app目录下 - 确认项目build.gradle已正确引入Firebase Auth、Firebase Firestore、Google Play服务登录相关依赖
- 确认已添加协程扩展依赖
org.jetbrains.kotlinx:kotlinx-coroutines-play-services,否则await()方法无法正常调用
内容的提问来源于stack exchange,提问作者Tanmay Agarwal
相关产品推荐
相关产品推荐

