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