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

问题描述 投票:3回答:1

我有一个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();
    }
});

这是一种在活动中使用observe的方法(有效但需要将逻辑保留在活动中):

viewModel.user().observe(this, x -> {
    if (x != null && x.data != null) {
        viewModel.items(x.data.token).observe(this, result -> {
            // use result
        });
    }
});
android android-architecture-components android-livedata android-architecture-lifecycle
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.