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

Android:如何在Fragment中订阅Activity的ViewModel的LiveData?

问题:Fragment无法观察Activity共享ViewModel的LiveData

我通过MainViewModel从MainActivity请求数据,数据存储在MainViewModel的LiveData中。现在需要让Fragment观察MainViewModel中的该LiveData数据,但当前在Fragment中观察无效,在Activity中观察却正常。

ViewModel代码:

class MainViewModel : ViewModel() {
    private val myRepository : MyRepository = MyRepositoryImpl()

    private val data: MutableLiveData<Data> = MutableLiveData()
    val dataResult: LiveData<Data> = data

    suspend fun getCoordinates(param: String){
        val dataApiResult = MyRepository.getData(param)
        data.postValue(dataApiResult)
    }
}

Fragment代码:

class MyFragment : Fragment() {

    private val mainViewModel: MainViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_my, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mainViewModel.dataResult.observe(viewLifecycleOwner, Observer {
            Log.d("tag", "SUPPOSE TO COME HERE")
        })
    }
}

解决方法:

1. 确认依赖是否正确

确保项目中导入了androidx.fragment:fragment-ktx依赖,by activityViewModels()是该库提供的扩展函数,没有依赖会导致Fragment获取的ViewModel实例与Activity不一致。

2. 检查协程调用方式

getCoordinates是挂起函数,必须在协程作用域内调用。Activity中调用时,要使用viewModelScope.launch启动协程,否则函数不会执行,LiveData也不会更新:

// MainActivity中的调用示例
mainViewModel.viewModelScope.launch {
    mainViewModel.getCoordinates("your_param")
}

3. 验证LiveData的值是否发生变化

  • 如果MyRepository.getData返回的dataApiResult与LiveData当前值(初始为null)相同,postValue不会触发观察者回调。可在postValue前打印日志,确认数据确实有更新。
  • 若需要数据为null时也触发回调,可改用MutableLiveData<Data?>,或把数据包装成Event类处理单次事件。

4. 确认Fragment与Activity共享同一个ViewModel实例

在ViewModel构造函数、Activity和Fragment中分别打印mainViewModel的哈希值,验证三者引用的是同一个对象。

5. 检查Fragment的生命周期状态

确保在onViewCreated或之后的生命周期方法中注册观察者,viewLifecycleOwner会绑定Fragment的视图生命周期,避免内存泄漏。如果Fragment处于DESTROYED状态,观察者会自动移除,无法收到回调。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:35:12