Android 导航组件在弹出后退堆栈时执行操作

Android navigation component perform an Action when popping backstack

我正在使用 android 导航组件,尽管早期出现了一些问题,但它现在运行良好。

我坚持 activity 多片段设计原则,我使用共享视图模型在片段之间进行通信。

我现在在我的应用程序中有一个场景,用户创建一些东西,保存它,然后返回到主列表片段(想像添加一个新联系人,除了它涉及的不仅仅是在一些框中输入)

当用户保存信息时,我需要从我的视图模型中清除数据(这是出于安全考虑而非性能),因为它们是共享视图模型,因此与 activity 生命周期相关联而不是片段,所以他们不会自己清除,我可以在正常流程中实现这一点,只需将数据设置为 null 并调用 navcontroller.popBackStack() 但如果用户自己按下我无法知道,因此无法清除这些视图模型,有什么想法吗?

您可以实现一个侦听器接口(例如 OnBackPressedListener)并在您各自的片段中使用它以在按下后退按钮(或向上导航)时采取行动。该界面将成为您的片段和 activity.

之间的桥梁

正确的方法我认为当时不可用,但你应该将你的视图模型范围限定到你的导航图,这样数据会被系统清除,你只处理导航,很快示例:

private ViewModelStoreOwner getStoreOwner() {
        NavController navController = Navigation
                .findNavController(requireActivity(), R.id.root_navigator_fragment);
        return navController.getViewModelStoreOwner(R.id.root_navigator);        
}


private void setUpSearchViewModel() {
    searchViewModel = new ViewModelProvider(getStoreOwner()).get(SearchViewModel.class);
}