簡體   English   中英

Android ViewModel 未從 BackStackEntry 中獲取所選項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM