[英]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.