Android LiveData-在第二次更新时不会触发switchMap

Ran*_*dom 5 android android-livedata android-architecture-lifecycle android-architecture-components

我有一个LiveData依赖于另一个对象LiveData。据我了解,Transformations.switchMap应该允许将它们链接起来。但是switchMap处理程序仅触发一次,并且不会对进一步的更新做出反应。相反,如果我observe在第一个对象上使用,并在准备好第二个对象时检索它,它就可以正常工作,但在这种情况下,我必须使用Activity而不是ViewModel。是否可以LiveData像一样链接对象,Transformations.switchMap但不仅可以接收第一个更新,还可以接收所有更新?

这是尝试使用switchMap

LiveData<Resource<User>> userLiveData = usersRepository.get();
return Transformations.switchMap(userLiveData, resource -> {
    if (resource.status == Status.SUCCESS && resource.data != null) {
        return apiService.cartItems("Bearer " + resource.data.token);
    } else {
        return AbsentLiveData.create();
    }
});
Run Code Online (Sandbox Code Playgroud)

这是observein活动的一种方法(可以工作,但需要保持逻辑活动):

viewModel.user().observe(this, x -> {
    if (x != null && x.data != null) {
        viewModel.items(x.data.token).observe(this, result -> {
            // use result
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

Ran*_*dom 1

作为解决方法,我使用了MediatorLiveData. 我将第一次调用的结果添加为源,并在准备就绪后将其替换为最终调用:

MediatorLiveData<MyResponse> result = new MediatorLiveData<>();
LiveData<Resource<User>> source = this.get();
result.addSource(source, resource -> {
    if (resource.status == Status.SUCCESS && resource.data != null) {
        result.removeSource(source);
        result.addSource(apiService.cartItems("Bearer " + resource.data.token), result::postValue);
    }
});
return result;
Run Code Online (Sandbox Code Playgroud)