1

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

问题

只有底部导航的导航图中的起始目的地保存其状态。而其他人则没有。[这意味着 onDestroy 永远不会仅用于起始目的地]。现在的问题是与起始目的地导航图关联的 ViewModel 永远不会被清除。

我正在寻找的行为

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

代码片段:

<?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"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_main"
            app:startDestination="@+id/nav_main_home">

    <include
            android:id="@+id/home_fragment_graph"
            app:graph = "@navigation/nav_main_home"/>

    <include
            android:id="@+id/profile_fragment_graph"
            app:graph = "@navigation/nav_main_profile"/>


    <include
            android:id="@+id/message_fragment_graph"
            app:graph = "@navigation/nav_main_message"/>


</navigation>

nav_main_home -nav_graph- for HomeFragment
nav_main_profile -nav_graph- for ProfileFragment
nav_main_message -nav_graph- for MessageFragment

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

4

1 回答 1

1

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

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

支持多个后退堆栈存在一个现有问题,这将导致每个底部导航项保存其状态并在您返回时恢复它。由于该问题尚未解决,有一个NavigationAdvancedSample提供了一种临时解决方法来获得该行为。

于 2019-08-03T18:34:59.880 回答