0

我正在使用 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)));
}
4

0 回答 0