我当前的导航版本是:
implementation("androidx.navigation:navigation-fragment-ktx:2.8.0")
implementation("androidx.navigation:navigation-ui-ktx:2.8.0")
在片段内我有一个
FragmentContainerView
和 BottomNavigationView
。我使用 navController
设置它们,如下所示:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navView: BottomNavigationView = binding.bottomNav
val navHostFragment = (childFragmentManager.findFragmentById(
R.id.navHostFragment
) as NavHostFragment)
navView.setupWithNavController(navController)
}
每当我浏览选项卡时(例如 home -> profile -> home),
ProfileViewModel
都会被保存(意味着它的 onCleared
不会被调用)。但是,如果我在选择 profile 选项卡时按后退按钮,则会调用 ProfileViewModel
的 onCleared
。
我什至尝试添加
OnBackPressedCallback
来覆盖任何后按,但它的 handleOnBackPressed
没有被调用:
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, onBackPressedCallback)
如何让
navController
在按下后退按钮时停止清除视图模型?
参考https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-apis
清除 ViewModel 通常是一件好事;通常您希望确保 ViewModel 不会在 UI 中显示过时的数据。
但是,如果您真的真的希望 ViewModel 在您导航时保留数据,一个简单的方法是将 ViewModel 的范围限制为 Activity:
val viewModel: SharedViewModel by activityViewModels()
Fragment 和 Activity 都有 ViewModel 存储,通过使用 Activity,您可以在导航到不同的 Fragment 时防止 ViewModel 被清除。