Android 菜单导航(抽屉)事件中未清除导航图范围的ViewModel
我正在使用导航组件和集成抽屉布局作为侧导航菜单 我有以下导航xml配置结构:Android 菜单导航(抽屉)事件中未清除导航图范围的ViewModel,android,navigation-drawer,android-architecture-navigation,Android,Navigation Drawer,Android Architecture Navigation,我正在使用导航组件和集成抽屉布局作为侧导航菜单 我有以下导航xml配置结构: <navigation android:id="@+id/mobile_navigation" app:startDestination="@id/nav_apple"> <navigation android:id="@+id/nav_apple"> <fragment
<navigation
android:id="@+id/mobile_navigation"
app:startDestination="@id/nav_apple">
<navigation android:id="@+id/nav_apple">
<fragment
android:id="@+id/nav_apple_fragment"
android:name="com.my.AppleFragment"
tools:layout="...">
... other fragments and actions which share ViewModel ...
</navigation>
<navigation android:id="@+id/nav_orange">
<fragment
android:id="@+id/nav_orange_fragment"
android:name="com.my.OrangeFragment"
tools:layout="...">
</navigation>
</navigation>
在“导航苹果”图的AppleFragment
和其他片段中,我使用以下代码使用导航图范围的ViewModel:
private val model: MyViewModel by navGraphViewModels(R.id.nav_apple)
它允许我共享数据并且工作得很好,但是当我使用侧菜单(抽屉)并导航到另一个目的地时,back-ViewModel数据仍然存在,这是不可取的
根据文档任何以这种方式创建的ViewModel对象都会一直存在,直到关联的NavHost及其ViewModelStore被清除,或者直到导航图从后堆栈中弹出。
我认为这个导航抽屉事件就是这样,但看起来好像我遗漏了什么。根据,开始目标(而且,如果该startDestination
指向一个
图形,则图形的startDestination
)始终位于后堆栈上
当导航图本身保留在后堆栈上时,附加到该导航图的状态和视图模型也保留
随着下一步工作的进行,每个底部导航项目都将有自己的后堆栈,项目之间的交换将自动保存当前堆栈,并在您重新选择时将其还原。因此,您应该期望底部导航项目在发布后自动保留其ViewModels。您是如何连接的我们的侧菜单?请包括您的活动代码。@ianhanniballake是的,请检查我更新的问题是
nav_apple
您的mobile_导航图的startDestination
?@ianhanniballake,是的,我已经更新了问题。很抱歉confusion@ianhanniballake我刚刚尝试替换startDestination
从nav_-apple
到nav_-orange
的mobile_-navigation
,它修复了行为-nav_-apple
模型被清除,因此在这种情况下,我似乎缺少了startDestination
的一些特殊含义。不幸的是,业务逻辑不允许替换起始目的地,我需要另一个w怎么修呢
val navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
topLevelDestinationIds = setOf(
R.id.nav_apple,
R.id.nav_orange
),
drawerLayout = binding.drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
binding.navView.setupWithNavController(navController)
private val model: MyViewModel by navGraphViewModels(R.id.nav_apple)