【问题标题】:Changing LiveData in Activity doesn't notify observer in child Fragment在活动中更改 LiveData 不会通知子片段中的观察者
【发布时间】:2020-10-07 17:16:43
【问题描述】:

我正在尝试更新承载片段的活动中的 LiveData 对象,然后我想在观察后更新片段的 UI。问题是片段的用户界面仅在片段重新启动时更新。每次activity中的数据变化时,如何实现fragment中Ui的实时更新?

// 活动代码:

   transactionViewModel = ViewModelProviders.of(this, providerFactory).get(TransactionViewModel.class);  
transactionViewModel.getUserValues();

/// 片段:

    transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); 
viewModel.userValues.observe(getActivity(), userValues -> {  if(userValues.data != null){}//update the ui }

【问题讨论】:

    标签: java android fragment viewmodel android-livedata


    【解决方案1】:

    为了实现“Ui 的实时更新”,我建议使用data-binding

    在您的代码中,我认为您正在观察 viewModel 的不同引用。

    在投射你的活动后尝试观察(我在这里使用 kotlin):

            val myActivity = (requireActivity() as MainActivity)
            myActivity.transactionViewModel.viewModel.userValues.observe(getActivity(), userValues -> { 
            if(userValues.data != null){}//update the ui }
    

    【讨论】:

      【解决方案2】:

      片段代码

      transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); 
      
      viewModel.userValues.observe(getActivity(), userValues -> {  
         if(userValues.data != null) {
             //update the UI 
         }
      }
      

      应该是

      transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); 
      
      // this goes in onViewCreated
      viewModel.userValues.observe(viewLifecycleOwner, userValues -> {  
          if(userValues.data != null){
               //update the ui
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 2021-04-08
        相关资源
        最近更新 更多