【问题标题】:ViewModel and LiveData Observer Not InvokingViewModel 和 LiveData 观察者未调用
【发布时间】:2020-07-16 15:12:36
【问题描述】:

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

【问题讨论】:

    标签: android kotlin android-livedata


    【解决方案1】:

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

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

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

    虽然对于较新版本的 ViewModel 和 fragment-ktx 工件,这不是必需的,但我建议使用 latest version

    【讨论】:

    • 我有相同的 ViewModelProvider
    • 请注意,您必须在 Fragment 1 和 Fragment 2 中使用活动实例化视图模型。
    • 用 Fragment 1 和 Fragment 2 中的活动实例化视图模型。~ 是的
    【解决方案2】:

    最有可能发生的事情是,尽管您发表了仅供参考的评论,但您实际上是在为每个上下文实例化不同的 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>()
    

    【讨论】:

    • ViewModelProviders.of 已弃用
    • 尝试使用ViewModelProvider(let {activity}!!).get(
    • 我可以看到自从我上次使用它以来,API 发生了一些变化,但想法似乎是一样的:你必须确保你试图获取的 viewmodel 的所有者不是片段本身,而是父活动。在 Java 中是这样完成的 new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多