【问题标题】:Android ViewModel not getting Selected Item from BackStackEntryAndroid ViewModel 未从 BackStackEntry 获取选定项
【发布时间】:2022-01-05 11:56:23
【问题描述】:

我有一个可以从底部导航栏访问的地图片段。我还希望能够通过单击我的回收站视图来访问它(如果从回收站视图中单击它,则显示来自回收站视图的位置)。为此,我尝试检查 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 窗口中获得 MAPFRAGMENT 日志。我已经验证我的 logcat 正在工作,并且 onclick 方法实际上是在 viewmodel 中设置值。

【问题讨论】:

  • 我正在使用共享视图模型。我想检查后台堆栈以查看用户来自哪里,如果他们来自按钮,我想显示列表中的位置,如果不是,我想显示他们当前的位置。

标签: android android-fragments mvvm viewmodel android-livedata


【解决方案1】:

ViewModelProviders.of(this) 将 ViewModel 与 this 相关联 - 您的 Fragment 本身,而不是 NavBackStackEntry(它是 Fragment 层之上的一个完全独立的层)。

相反,您需要在 FishListFragment 中使用 navController.getCurrentBackStackEntry()new ViewModelProvider() 将 ViewModel 与您稍后在 MapFragment 中访问的 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);

【讨论】:

  • 谢谢,几乎成功了。如果我首先从底部导航加载地图片段,然后返回列表片段,然后单击“转到位置按钮”,它将记录正确的位置。但是,如果我首先加载 listfragment 并单击“转到位置”按钮,它不会记录 MAPFRAGMENT: Location 日志,直到我单击列表片段的底部导航按钮。知道为什么会这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2011-11-17
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
相关资源
最近更新 更多