[英]Android ViewModel not getting Selected Item from BackStackEntry
我有一個 map 片段,可以從底部導航欄訪問。 我還希望能夠通過單擊我的回收站視圖來訪問它(如果從回收站視圖中單擊它,則顯示來自回收站視圖的位置)。 為此,我嘗試檢查 backstack 以查看 listfragment 是否存在。 我無法讓它工作,有人可以看到我的代碼的問題嗎?
視圖模型:
private final MutableLiveData<Fish> selected = new MutableLiveData<Fish>();
public void select(Fish item) {
selected.setValue(item);
}
public LiveData<Fish> getSelected() {
return selected;
}
public MapViewModel(Application application){
super(application);
}
ListFragment(選擇在 onclick 方法中):
mMapViewModel = ViewModelProviders.of(this).get(MapViewModel.class);
Log.d("view-click", String.valueOf(fish.getLocation()));
mMapViewModel.select(fish);
Navigation.findNavController(view).navigate(R.id.action_fishListFragment_to_mapFragment2);
地圖片段:
NavController navController = NavHostFragment.findNavController(this);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.fishListFragment);
mMapViewModel = new ViewModelProvider(backStackEntry).get(MapViewModel.class);
mMapViewModel.getSelected().observe(backStackEntry, list -> {
Log.d("MAPFRAGMENT",list.getLocation() + "");
});
我沒有收到任何錯誤,但我也沒有在 logcat window 中獲得 MAPFRAGMENT 日志。 我已經驗證我的 logcat 正在工作,並且 onclick 方法實際上是在 viewmodel 中設置值。
ViewModelProviders.of(this)
將 ViewModel 與this
相關聯 - 您的 Fragment 本身,而不是NavBackStackEntry
(它是 Fragment 層之上的一個完全獨立的層)。
相反,您需要在 FishListFragment 中使用navController.getCurrentBackStackEntry()
和new ViewModelProvider()
來將 ViewModel 與您稍后在NavBackStackEntry
中訪問的 NavBackStackEntry 相關聯:
NavController navController = Navigation.findNavController(view);
NavBackStackEntry currentBackStackEntry = navController.getCurrentBackStackEntry();
mMapViewModel = new ViewModelProvider(currentBackStackEntry).get(MapViewModel.class);
Log.d("view-click", String.valueOf(fish.getLocation()));
mMapViewModel.select(fish);
navController.navigate(R.id.action_fishListFragment_to_mapFragment2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.