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

跨不同Activity的Fragment共享CarViewModel数据为空问题求助

问题原因

你用by activityViewModels()获取CarViewModel,这个方法会把ViewModel绑定到当前Fragment所在的Activity的ViewModelStore。不同Activity的ViewModelStore是完全独立的,所以Fragment A和Fragment B(分属不同Activity)拿到的是两个完全不同的CarViewModel实例,自然数据无法共享。

解决方案

这里提供两种符合Hilt规范的解决思路,根据你的架构需求选择:

方案1:用Application级ViewModel实现跨Activity共享

把ViewModel的作用域提升到Application级别,让所有组件共享同一个ViewModel实例:

  1. 先确保你的Application类实现ViewModelStoreOwner并被Hilt注解:
@HiltAndroidApp
class MyApplication : Application(), ViewModelStoreOwner {
    private val viewModelStore = ViewModelStore()

    override fun getViewModelStore(): ViewModelStore {
        return viewModelStore
    }
}
  1. 在Fragment和BottomSheet中,指定从Application获取ViewModel:
private val viewModel: CarViewModel by viewModels({
    requireContext().applicationContext as MyApplication
})

这样不管在哪个Activity的Fragment中,拿到的都是同一个CarViewModel实例,数据会全局共享。

方案2:用单例Repository共享数据(更符合MVVM架构)

ViewModel的职责是持有UI状态,跨组件共享的数据应该放在Repository层。通过Hilt提供单例Repository,让不同ViewModel实例共享同一数据源:

  1. 创建单例的过滤数据Repository:
@Singleton
class CarFilterRepository @Inject constructor() {
    private val _carFilters = MutableLiveData<CarFilters>().apply {
        value = CarFilters()
    }
    val carFilters: LiveData<CarFilters> get() = _carFilters

    private val _dates = MutableLiveData<DateFilters?>()
    val dates: LiveData<DateFilters?> get() = _dates

    fun updateDates(dates: DateFilters) {
        _dates.value = dates
    }

    fun updateFilters(updatedFilters: CarFilters) {
        _carFilters.value = updatedFilters
    }
}
  1. 修改CarViewModel,注入这个Repository并代理数据操作:
@HiltViewModel
class CarViewModel @Inject constructor(
    private val filterRepository: CarFilterRepository
) : ViewModel() {
    val carFilters: LiveData<CarFilters> get() = filterRepository.carFilters
    val dates: LiveData<DateFilters?> get() = filterRepository.dates

    fun updateDates(dates: DateFilters) {
        filterRepository.updateDates(dates)
    }

    fun updateFilters(updatedFilters: CarFilters) {
        filterRepository.updateFilters(updatedFilters)
    }
}
  1. Fragment中依然用by activityViewModels()获取ViewModel即可:
private val viewModel: CarViewModel by activityViewModels()

此时即使不同Activity的ViewModel是不同实例,它们依赖的Repository是单例,数据会自动同步共享。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:55:14