我正在使用 RxJava3 从 Firestore 读取数据并通过 LiveDataReactiveStreams 将其转换为 LiveData。我有食物清单,点击食物我想加载有关该特定食物的详细信息。问题是,当用户单击一个项目并加载它时,在单击第二个项目后,他会从前一个项目中获取值一秒钟,直到加载新数据。我注意到我的存储库中的流总是触发新的点击并返回以前的数据,但我想显示新项目的第一个加载状态,然后显示该加载的项目。我将如何防止它返回以前的值,或清除 LiveData?
存储库
@NonNull
public Flowable<Resource<FoodDetailModel>> getFoodDetail(@NonNull String entityId, @NonNull String foodId) {
return Flowable.<Resource<FoodDetailModel>>create(emitter -> {
CollectionReference entitiesRef = FirebaseFirestore.getInstance().collection(Common.COLLECTION_ENTITIES);
entitiesRef.document(entityId)
.collection(Common.COLLECTION_MENU_ITEMS)
.document(foodId).get().addOnCompleteListener(itemTask -> {
if(itemTask.isSuccessful()) {
DocumentSnapshot document = itemTask.getResult();
if(document != null && document.exists()) {
FoodModel foodModel = document.toObject(FoodModel.class);
if(foodModel != null) {
foodModel.setLocalizedFields();
entitiesRef.document(entityId)
.collection(Common.COLLECTION_MENU_ITEMS_DETAILS)
.document(foodId).get().addOnCompleteListener(detailsTask -> {
if(detailsTask.isSuccessful()) {
DocumentSnapshot detailsDocument = detailsTask.getResult();
if(detailsDocument != null && detailsDocument.exists()) {
FoodDetailModel foodDetailModel = detailsDocument.toObject(FoodDetailModel.class);
if(foodDetailModel != null) {
foodDetailModel.setFoodModel(foodModel);
emitter.onNext(Resource.success(foodDetailModel));
emitter.onComplete();
}
else
emitter.onNext(Resource.error(null, Resource.MESSAGE_SUCCESS_BUT_NO_DATA));
}
else
emitter.onNext(Resource.error(null, Resource.MESSAGE_SUCCESS_BUT_NO_DATA));
}
else
emitter.onError(detailsTask.getException());
});
}
else
emitter.onNext(Resource.error(null, Resource.MESSAGE_SUCCESS_BUT_NO_DATA));
}
else
emitter.onNext(Resource.error(null, Resource.MESSAGE_SUCCESS_BUT_NO_DATA));
}
else
emitter.onError(itemTask.getException());
});
}, BackpressureStrategy.MISSING)
.subscribeOn(Schedulers.io())
.startWithItem(Resource.loading())
.onErrorReturn(throwable -> Resource.error(null, "Error loading FoodDetails return: ", throwable));
}
视图模型
public LiveData<Resource<FoodDetailModel>> getFoodLiveData() {
return Transformations.switchMap(cartItemMutableLiveData, input ->
LiveDataReactiveStreams.fromPublisher(cartRepository.getFoodDetail(getEntityId(),
input.getId()).map(CartViewModel.this::mapSizesAddons)));
}