Kotlin检测Google账号登录状态时GoogleSignIn.getLastSignedInAccount报空指针异常
问题根因
你遇到的空指针异常本质是GoogleSignIn.getLastSignedInAccount()方法传入的this指向的对象不是有效、已初始化的Context实例,方法内部调用getApplicationContext()时触发空引用。
常见场景与解决方案
场景1:方法定义在非Context子类(如ViewModel、普通工具类)中
此时this没有Context属性,需要将Context作为参数传入,优先使用ApplicationContext避免内存泄漏,代码修改参考:fun isSignedIn(context: Context): Boolean { println(FirebaseAuth.getInstance().currentUser) val signInAccount = GoogleSignIn.getLastSignedInAccount(context.applicationContext) println(signInAccount) return signInAccount != null }场景2:方法定义在Fragment中
若调用时机早于Fragment关联到Activity、或Fragment已解绑,此时Context为空,需要先判断Fragment挂载状态再调用:fun isSignedIn(): Boolean { // 先判断Fragment是否已挂载到Activity if (!isAdded) return false println(FirebaseAuth.getInstance().currentUser) val signInAccount = GoogleSignIn.getLastSignedInAccount(requireContext().applicationContext) println(signInAccount) return signInAccount != null }场景3:方法定义在Activity中
检查方法调用时机是否早于Activity的onCreate生命周期(如类成员属性初始化时直接调用),此时Activity尚未完成初始化,Context为空,将调用逻辑移到onCreate及之后的生命周期阶段即可。
补充优化方案
由于你已经集成了Firebase Auth,Google账号登录成功后Firebase会同步登录状态,可直接通过Firebase当前用户判断登录状态,不需要额外调用GoogleSignIn相关接口,代码更简洁也避免了Context传参问题:
fun isSignedIn(): Boolean = FirebaseAuth.getInstance().currentUser != null
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

