首页 > 解决方案 > 使用导航库销毁片段/触发器 onDestroy 的实例

问题描述

我正在使用导航库,我的用例是在后按时保留片段状态,我通过在 onViewCreated 中返回已经膨胀的绑定来实现,因为当更改片段时导航似乎不会破坏该片段的现有实例,当您导航时实际视图变量存在向后或向上。

但是当我需要重新创建这个 Fragment 实例时,我也有一个用例,所以我希望有一种方法可以为那个 Fragment 调用 onDestroy()。但我没有看到任何用于删除/获取 backstack 实例中现有的 api。

所以我的问题是如何从 nav back stack 获取 Fragment 的现有实例并将其销毁,或者通过调用 nav controller api 将其删除

一些代码:

 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewModel = ViewModelProviders.of(requireActivity(), mViewModelFactory)
            .get(MainViewModel::class.java)
        parseNavigationExtra()
        return if (::mBinding.isInitialized) {
            mBinding.root
        } else {
        //create new binding
}

所以当我调用这个动作时,我仍然得到旧的绑定根,因为变量仍然存在。

  <action
        android:id="@+id/clearBackStack"
        app:destination="@+id/mainFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/mobile_navigation"
        app:popUpToInclusive="true" />

标签: androidandroid-fragmentsnavigationandroid-jetpack

解决方案


自 2.1.0 以来导航库的变化

NavBackStackEntry:您现在可以调用 NavController.getBackStackEntry(),传入目的地的 ID 或返回堆栈上的导航图。除了提供用于启动该目的地的参数外,返回的 NavBackStackEntry 还提供导航驱动的 LifecycleOwner、ViewModelStoreOwner(与 NavController.getViewModelStoreOwner() 返回的相同)和 SavedStateRegistryOwner。

所以计划是使用新的 api 来查看 NavBackStackEntry 可用的内容。


推荐阅读