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

如何在Jetpack Compose页面间保留Google Auth用户数据并通过导航传递?

解决Jetpack Compose导航传递Google Auth用户数据的几种方案

方案一:直接利用FirebaseAuth全局实例(最优解)

FirebaseAuth本身是全局单例,登录成功后,任何页面都可以直接调用FirebaseAuth.getInstance().currentUser获取当前登录用户,完全不需要手动传递数据。只要用户会话未过期、未主动登出,Firebase会自动维护登录状态,这是最省心的方式,也避免了导航传参的麻烦。

方案二:使用共享ViewModel管理状态

如果需要在页面间同步用户状态变化,可以创建一个跨页面共享的AuthViewModel,登录成功后将用户数据存入ViewModel的状态容器,其他页面直接读取即可:

class AuthViewModel : ViewModel() {
    private val _currentUser = MutableStateFlow<FirebaseUser?>(null)
    val currentUser: StateFlow<FirebaseUser?> = _currentUser

    fun updateCurrentUser(user: FirebaseUser?) {
        _currentUser.value = user
    }
}
  • 登录页面:登录成功后调用viewModel.updateCurrentUser(firebaseUser)
  • 目标页面:通过ViewModelProvider或依赖注入(如Hilt)获取同一个AuthViewModel,监听currentUser状态即可拿到用户数据

方案三:序列化关键信息后传递(谨慎使用)

如果必须通过导航参数传递,可将用户非敏感的关键信息序列化后转为字符串传递,避免直接传对象:

  1. 定义包含用户核心信息的数据类:
data class UserAuthInfo(
    val uid: String,
    val email: String?,
    val displayName: String?,
    val photoUrl: String?
)
  1. 登录成功后转换并序列化:
val userInfo = UserAuthInfo(
    uid = user.uid,
    email = user.email,
    displayName = user.displayName,
    photoUrl = user.photoUrl?.toString()
)
val jsonString = Gson().toJson(userInfo)
  1. 导航时传递字符串参数:
navController.navigate("target_screen?userInfo=$jsonString")
  1. 目标页面接收并反序列化:
val args = TargetScreenArgs.fromNavArgs(navArgs)
val userInfo = Gson().fromJson(args.userInfo, UserAuthInfo::class.java)

⚠️ 注意:不要传递密码、令牌等敏感信息,避免安全风险。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:24:59