使用 navController 设置底部导航视图会导致按下后退时清除视图模型

问题描述 投票:0回答:1

我当前的导航版本是:

    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
在按下后退按钮时停止清除视图模型?

android bottomnavigationview android-jetpack-navigation
1个回答
0
投票

参考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 被清除。

© www.soinside.com 2019 - 2024. All rights reserved.