Android Navigation组件:底部Tab带参数跳转的ViewModel复用问题
背景
应用采用单Activity架构,内部包含底部Tab导航。
在“Home”Tab中有一个按钮,点击后需携带参数跳转到TabB(参数用于页面渲染)。
代码
假设Navigation组件已正确配置,除当前场景外其他功能均正常。
主导航文件nav_main.xml如下:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph.xml" app:startDestination="@+id/menu_home"> <action android:id="@+id/action_navigate_to_TabB" app:destination="@id/menu_tabB"/> <include app:graph="@navigation/nav_home" /> <include app:graph="@navigation/nav_tabB" /> </navigation>
Home Tab的导航文件nav_home.xml如下:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/menu_home" app:startDestination="@id/homeFragment"> <fragment android:id="@+id/homeFragment" android:name="com.example.home.HomeFragment" /> </navigation>
TabB的导航文件nav_tabB.xml如下:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/menu_tabB" app:startDestination="@id/tabBFragment"> <fragment android:id="@+id/tabBFragment" android:name="com.example.RootTabBFragment"> // Some argument tags </fragment> </navigation>
我使用以下代码片段实现从Home到TabB的带参数跳转:
// If TabB's backstack is done for, it should pop up to start destination. val navOptions = NavOptions.Builder().setPopUpTo( navController.graph.findStartDestination().id, inclusive = false, saveState = true ).build() fragment.findNavController() .navigate( resId = R.id.action_navigate_to_TabB, args = // Some args, navOptions = navOptions )
如上所示,该action在主导航图XML中定义为全局action:
<action android:id="@+id/action_navigate_to_TabB" app:destination="@id/menu_tab_B" />
我也曾尝试将该action仅定义在Home导航XML中,但同样无效。
问题
执行上述代码后出现以下情况:
- 创建了一个新的TabB根Fragment(符合预期)。
- 创建了新的ViewModel(VM)而非复用旧VM(不符合预期)。旧VM尚未被销毁/清除
- 之后用户切换Tab并返回TabB时,Navigation组件恢复旧VM而非新VM,导致状态不一致且过时。
或许我从一开始的实现方式就有误?是否遗漏了某些步骤?
恳请各位提供帮助!
内容的提问来源于stack exchange,提问作者Ahmed Ashraf
相关产品推荐
相关产品推荐

