Android Kotlin开发:如何将Firebase Auth数据传递给多个Activity与Fragment
方案可行性分析
第一种层层传递Intent的方案
- 可正常运行,但可维护性极差:每个中间页面都要写重复的get/putExtra代码,后续如果要加新的参数或者修改参数名,要修改所有涉及的中间页面,很容易出现漏传、传错的问题
- 只适合少量单次跳转的参数传递,不适合全局通用的Auth类信息
第二种一次性传多个页面的方案
- 完全不可行:
- Intent仅在调用
startActivity()执行跳转时才会携带参数传递给目标页面,提前创建多个Intent并不会提前把参数塞给后面的页面 - Fragment不能通过
startActivity()启动,它必须依附于Activity存在,这段代码直接运行会抛出异常
- Intent仅在调用
推荐实现方案
对于Auth ID这类全局通用的用户信息,不需要层层传递,以下是三种成本从低到高的实现方式,优先选第一种:
方案1:直接使用Firebase Auth自带接口获取(最推荐)
你用了Firebase服务,本身登录成功后Firebase Auth会自动缓存当前登录用户的信息,任何页面都可以直接调用接口获取,完全不需要自己手动传递:
// 任意Activity/Fragment中都可以直接调用,不需要提前传参 val currentUser = FirebaseAuth.getInstance().currentUser if (currentUser != null) { val userId = currentUser.uid // 就是你要的用户ID // 后续添加收藏的逻辑直接用这个userId即可 }
方案2:SharedPreferences全局存储
如果是你自定义的、Firebase没有存储的用户标识,可以存在本地SP里,登录成功的时候存一次,后续所有页面直接读取:
// 登录成功后在LoginActivity里存储一次 val sharedPref = getSharedPreferences("AppGlobalConfig", MODE_PRIVATE) sharedPref.edit() .putString("docIDFromLoginAuth", 你登录拿到的docID) .apply() // 任意页面需要时读取 val sharedPref = requireActivity().getSharedPreferences("AppGlobalConfig", Context.MODE_PRIVATE) val docID = sharedPref.getString("docIDFromLoginAuth", null)
方案3:Activity范围ViewModel(适合同Activity下多Fragment共享数据)
如果你的多个Fragment都依附在同一个Activity下,可以用ViewModel实现数据共享,不需要传参:
第一步 定义ViewModel类
import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class AuthViewModel : ViewModel() { // 存储用户ID,内部用MutableLiveData,外部暴露不可修改的LiveData private val _authDocId = MutableLiveData<String?>() val authDocId: LiveData<String?> = _authDocId // 提供设置ID的方法 fun setAuthDocId(id: String?) { _authDocId.value = id } }
第二步 初始化存储数据
在承载Fragment的Activity(比如你的HomeActivity)中初始化ViewModel,把登录传过来的ID存进去:
// HomeActivity.kt import androidx.activity.viewModels class HomeActivity : AppCompatActivity() { // 初始化和当前Activity生命周期绑定的ViewModel private val authViewModel: AuthViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 拿到LoginActivity传过来的ID存入ViewModel val docId = intent.getStringExtra("docIDFromLoginAuth") authViewModel.setAuthDocId(docId) } }
第三步 任意依附于该Activity的Fragment中直接读取
// HomeFragment/ProductFragment等任意同Activity下的Fragment import androidx.fragment.app.activityViewModels class HomeFragment : Fragment() { // 获取和宿主Activity绑定的ViewModel实例,和Activity里的是同一个对象 private val authViewModel: AuthViewModel by activityViewModels() // 需要用的时候直接取 private fun test() { val docId = authViewModel.authDocId.value // 后续业务逻辑 } }
内容的提问来源于stack exchange,提问作者Cayden
相关产品推荐
相关产品推荐

