跨不同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实例:
- 先确保你的Application类实现
ViewModelStoreOwner并被Hilt注解:
@HiltAndroidApp class MyApplication : Application(), ViewModelStoreOwner { private val viewModelStore = ViewModelStore() override fun getViewModelStore(): ViewModelStore { return viewModelStore } }
- 在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实例共享同一数据源:
- 创建单例的过滤数据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 } }
- 修改
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) } }
- Fragment中依然用
by activityViewModels()获取ViewModel即可:
private val viewModel: CarViewModel by activityViewModels()
此时即使不同Activity的ViewModel是不同实例,它们依赖的Repository是单例,数据会自动同步共享。
内容的提问来源于stack exchange,提问作者flutra
相关产品推荐
相关产品推荐

