Android 对于起始目的地,底部导航的行为不同

Android 对于起始目的地,底部导航的行为不同,android,viewmodel,bottomnavigationview,android-jetpack-navigation,Android,Viewmodel,Bottomnavigationview,Android Jetpack Navigation,最近,当我使用NavController进行设置时,我发现了这种奇怪的底部导航行为 问题 只有底部导航的导航图中的起始目的地保存其状态。而其他人则不这样做[这意味着onDestroy永远不会仅作为起始目的地调用]。现在,与此相关的问题是与起始目标导航图关联的ViewModel从未被清除 我正在寻找的行为 如何使起始目的地生命周期与所有其他目的地一样,以便在目的地发生更改时,viewModel将被清除 代码段: 现在,当我从HomeFragment切换到ProfileFragment或Mess

最近,当我使用NavController进行设置时,我发现了这种奇怪的底部导航行为

问题

只有底部导航的导航图中的起始目的地保存其状态。而其他人则不这样做[这意味着onDestroy永远不会仅作为起始目的地调用]。现在,与此相关的问题是与起始目标导航图关联的ViewModel从未被清除

我正在寻找的行为

如何使起始目的地生命周期与所有其他目的地一样,以便在目的地发生更改时,viewModel将被清除

代码段:


现在,当我从HomeFragment切换到ProfileFragment或MessageFragment时,不会调用HomeFragment的onDestroy。但是当我从ProfileFragment或MessageFragment切换时,它们都会调用onDestroy。

片段(通过扩展导航)将片段的状态保存在后堆栈上。根据,图形的起始目标应始终位于后堆栈上,这就是为什么从其他底部导航项之一回击时返回起始目标,以及为什么它保留其状态。您永远不应该故意丢弃用户的状态

其他底部导航项目不保持其状态的原因是,一旦您通过点击另一个底部导航项目关闭它们,它们就不再在后堆栈上,因此碎片会破坏并丢弃与这些碎片相关的任何状态


有一个现有的,这将导致每个底部导航项目保存其状态,并恢复它时,你回到它。由于该问题尚未解决,因此有一个解决方案提供了一个临时解决方案来实现该行为。

一些代码可能会有所帮助。您是否被NavController束缚住了?手动完成会更容易。嘿,伊恩,谢谢你的内部消息和参考资料。这意味着如果我需要清除viewmodel,我应该在调用onDestroyView时手动执行此操作?当用户点击后退按钮/旋转设备时,片段将恢复其savedInstanceState(包括所有视图的状态)。您不应该清除ViewModel中位于后堆栈上的片段。
nav_main_home -nav_graph- for HomeFragment
nav_main_profile -nav_graph- for ProfileFragment
nav_main_message -nav_graph- for MessageFragment