0

我有一个 MVVM 设置,两个片段通过 ViewModel 交互。我SourceFragment正在更新MutableLiveDataVM 中的两个 LatLng。我的第二个是MapFragment用两个 LatLng LiveData 绘制路线。两个片段在 Activity 启动时被加载。SourceFragment 更新 LatLngs。在请求绘制路线之前,我需要等待地图加载,并且在MutableLiveData加载地图后我会更新第三个布尔值。目前我实现这一点的方法是通过一组 if 语句为MutableLiveData我的三个设置三个单独的 viewModel Observers来检查所有三个设置的时间。我有一种感觉,这可以用类似的方法做得更好,但我还没有找到一个我可以解决的例子。是MapFragmentMutableLiveDataMediatorLiveDataMediatorLiveData或其他适用于此的东西?

我的源代码片段

viewModel.setPickupLocation(pickupLatLng);
viewModel.setDestinationLatLng(destinationLatLng());

我的地图片段

@Override
public void onActivityCreated(@NonNull Bundle savedInstanceState) {
    Log.d(TAG, "onActivityCreated: called");
    super.onActivityCreated(savedInstanceState);

    getCustomerOrDriverViewModel();

}

private void initViewModels() { 

    viewModel.getPickupLocation().observe(getViewLifecycleOwner(), new Observer<LatLng>() {
        @Override
        public void onChanged(@NonNull LatLng pickupLocation) {
            Log.d(TAG, "onChanged: from onActivityCreated: called for getPickupLocation");

            if(viewModel.getMapReady().getValue() != null) {
                if(viewModel.getMapReady().getValue()) {
                    resetRoute();

                    setSingleMarker(pickupLocation);
                    if(viewModel.getDestinationLatLng().getValue() != null) {
                        plotRoute(viewModel.getDestinationLatLng().getValue(), pickupLocation);
                    }
                }
            }
        }
    });

    viewModel.getDestinationLatLng().observe(getViewLifecycleOwner(), new Observer<LatLng>() {
        @Override
        public void onChanged(@NonNull LatLng destinationLatLng) {
            Log.d(TAG, "onChanged: from onActivityCreated: called for getPickupLocation");
            if(viewModel.getMapReady().getValue() != null) {
                if(viewModel.getMapReady().getValue()) {
                    resetRoute();

                    if(viewModel.getPickupLocation().getValue() != null) {
                        plotRoute(destinationLatLng, viewModel.getPickupLocation().getValue());
                    }
                }
            }
        }
    });

    viewModel.getMapReady().observe(getViewLifecycleOwner(), new Observer<Boolean>() {
        @Override
        public void onChanged(@NonNull Boolean ready) {
            Log.d(TAG, "onChanged: from onActivityCreated: called for getMapReady");
            if(ready) {
                if(viewModel.getPickupLocation().getValue() != null && viewModel.getDestinationLatLng().getValue() != null) {
                    Log.d(TAG, "onChanged: from onActivityCreated: called for getMapReady: plotting route");
                    resetRoute();
                    plotRoute(viewModel.getDestinationLatLng().getValue(), viewModel.getPickupLocation().getValue());
                }
            }
        }
    });
}

mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
    @Override
    public void onMapLoaded() {
        viewModel.setMapReady(true);
    }
});

我的视图模型

private MutableLiveData<LatLng> pickupLocation = new MutableLiveData<>();
private MutableLiveData<LatLng> destinationLatLng = new MutableLiveData<>();
private MutableLiveData<Boolean> mapReady = new MutableLiveData<>();

public void setPickupLocation(LatLng input) {
    Log.d(TAG, "setPickupLocation: ");
    pickupLocation.setValue(input);
}

public void setDestinationLatLng(LatLng input) {
    Log.d(TAG, "setPickupLocation: ");
    destinationLatLng.setValue(input);
}

public void setMapReady(Boolean input) {
    Log.d(TAG, "setPickupLocation: ");
    mapReady.setValue(input);
}

public MutableLiveData<LatLng> getPickupLocation() {
    Log.d(TAG, "getPickupLocation: ");
    return pickupLocation;
}

public MutableLiveData<LatLng> getDestinationLatLng() {
    Log.d(TAG, "getDestinationLatLng: ");
    return destinationLatLng;
}

public MutableLiveData<Boolean> getMapReady() {
    Log.d(TAG, "getMapReady: ");
    return mapReady;
}
4

1 回答 1

0

在 MyMapFragment 中有 3 个变量来跟踪每个视图模型请求。在片段创建时使所有 3 个变量为空。当每个 viewModel 请求完成时,更改相应的变量。

然后做一个辅助方法

private void setupData(){
    if(variable1 == null || variable2 == null || variable3 == null){
        return;
    }
    plotRoute(xxxxxx);
}

然后在每个视图模型响应中调用 setupData() 代替三重嵌套 if 语句检查

于 2020-02-27T00:25:21.723 回答