You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:23:19