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);
}
我正在使用 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);
}