【问题标题】:Viewmodel observing LiveData - how?Viewmodel 观察 LiveData - 如何?
【发布时间】:2018-01-04 10:28:09
【问题描述】:

LifecycleLiveData 之前,Viewmodel 可以很容易地观察到它自己的 observables 的变化。只需订阅Observable* 的更改并对它们做出反应。然后可以使用双向绑定来立即对用户的输入做出反应。

在 Android Studio Canary 中,现在允许绑定到 LiveData 对象,前提是 Binding 知道其所有者的生命周期(ViewBinding 现在有额外的setLifecycle 方法),Android Studio Canary information

您现在可以将 LiveData 对象用作数据绑定表达式中的可观察字段。 ViewDataBinding 类现在包含一个新的 setLifecycle 方法,您需要使用它来观察 LiveData 对象。

但是,Viewmodel documentation 明确指出:

ViewModel 对象可以包含 LifecycleObservers,例如 LiveData 对象。 但是,ViewModel 对象绝不能观察生命周期感知可观察对象的更改,例如 LiveData 对象。

(强调我的)

如果 ViewModel 无法订阅 LiveData 更改,如何立即对其做出反应?

而且,为什么 Viewmodel 不能观察到它自己的 LiveData 的变化?

【问题讨论】:

  • @pskink 在 vi​​ewmodel 和 view 之间传播数据就足够了。我感兴趣的是捕捉数据的变化。例如,用户更改复选框状态,我想对此做出反应并执行操作。我该怎么做?
  • @pskink LiveData.setValue 如何让我获取信息,该用户在 UI 中更改了某些内容?
  • @pskink 这没关系。 View 也可以手动设置它们,但我需要捕获 ViewModel 中的更改以立即对它们做出反应。如果不从 ViewModel 订阅 LiveData,我该怎么做?
  • @pskink 正如我所说,这无关紧要。 View 也可以从代码中手动设置 Livedata。重要的是我想听听 ViewModel 中的这些变化,以便我可以对它们做出反应。我该怎么做?
  • 使用 mediatorlivedata

标签: android mvvm binding android-lifecycle android-livedata


【解决方案1】:

我使用MediatorLiveData 解决了这个问题。您可以按照以下步骤操作。

  1. 创建一个变量(例如结果)。

    private final MediatorLiveData<Resource<RequestType>> result = new MediatorLiveData<>();
    
  2. 调用addSource 方法,其中第一个参数是LiveData,第二个参数是观察者。

    LiveData<Resource<EmptyResponse>> observable = service.createItems();
    result.addSource(observable, response -> {
        //Write code here 
    }
    

另见this SO answer。基本要求几乎相同。

【讨论】:

    【解决方案2】:

    如果您的 LiveData 对象之一发生更改,您可以使用 Transformations 调用操作。

    例如用户在Spinner 中选择了一个人,而您要加载相应的人对象。

    MutableLiveData<Integer> personId = new MutableLiveData<>();
    LiveData<Person> person = Transformations.switchMap(personId, id -> getPerson(id));
    

    【讨论】:

    • 这依赖于订阅person,这就是问题所在。
    猜你喜欢
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多