繁体   English   中英

ViewModel 和 LiveData 观察者未调用

[英]ViewModel and LiveData Observer Not Invoking

Observer未调用第二个片段。 任何帮助将不胜感激。

片段1

   viewModel.productData(model) 
   findNavController().navigate(R.id.actionProductListToDetails)

查看型号ViewModel

val productData = MutableLiveData<ModelProductSubItem>()
    fun productData(data: ModelProductSubItem) {
        productData.value = data
    }

片段2

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        viewModel = ViewModelProvider(this).get(ProductSubListItemViewModel::class.java)
        viewModel.productData.observe(viewLifecycleOwner, Observer{ it ->

           println("Product_Name"+it.product_name) // Not invoking
        })

试过了

viewModel = activity?.run {
            ViewModelProvider(this).get(ProductSubListItemViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
 })

FYI

我有相同的ViewModelProvider

我认为问题在于可能有两个 ViewModelProvider(this),每个在不同的片段上使用“this”。 如果您有两个提供程序,则有两个单独的模型不共享它们的触发器。

这就是为什么当您调用 ViewModelProvider 时,您调用将片段保存为单一来源的活动:

viewmodel = activity?.run {
    ViewModelProviders.of(this).get(SomeViewModel::class.java)
} ?: throw Exception("Invalid Activity")

尽管对于较新版本的 ViewModel 和 fragment-ktx 工件,这不是必需的,但我建议使用这个最新版本

最有可能发生的事情是,尽管您的 FYI 评论,您实际上是在为每个上下文实例化不同的 ViewModel。 如果你想在多个 Fragment 之间共享同一个 Activity ViewModel 实例,那么每个 Fragment 都应该像这样获得共享的 ViewModel:

new ViewModelProvider(requireActivity()).get(SomeViewModel.class)

代替

new ViewModelProvider(this)).get(SomeViewModel.class)

如果您使用的是 Kotlin 扩展(KTX),我相信您应该这样做:

val viewModel by activityViewModels<SomeViewModel>()

代替

val viewModel by viewModels<SomeViewModel>()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM