导航组件 NavDeepLinkBuilder 回栈

Posted

技术标签:

【中文标题】导航组件 NavDeepLinkBuilder 回栈【英文标题】:Navigation Component NavDeepLinkBuilder back stack 【发布时间】:2021-05-14 14:21:12 【问题描述】:

我在从深层链接(通过通知)启动应用程序时遇到了后台堆栈问题。

总体思路是我有 3 个片段(A、B、C)。 A 屏幕用作启动屏幕,所以我在动作中添加了popUpTopopUpToInclusive,所以我再也看不到它了。我的深层链接目的地是片段 C。为了实现正确的回栈,我将 B 和 C 合并到嵌套导航中。不幸的是,当我在片段 B 中按下后退按钮时,应用程序正在显示片段 A。我猜这是因为当应用程序从深层链接本身启动时,从未调用过带有 popUpTo 的从 A 到 B 的操作。我的问题是:如何避免在这种特殊情况下从 B 回到 A?

提前致谢!我附上示例代码:

<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_graph"
    app:startDestination="@id/splashFragment">

    <fragment
        android:id="@+id/A"
        android:name="A"
        android:label="A" >
        <action
            android:id="@+id/action_A_to_B"
            app:destination="@id/B"
            app:popUpTo="@id/A"
            app:popUpToInclusive="true" />
    </fragment>
    <navigation android:id="@+id/nested_nav"
        app:startDestination="@id/B">
        <fragment
            android:id="@+id/B"
            android:name="B"
            android:label="B">
            <action
                android:id="@+id/action_B_to_C"
                app:destination="@id/C" />
        </fragment>
        <fragment
            android:id="@+id/C"
            android:name="C"
            android:label="C">
        </fragment>
    </navigation>
</navigation>

还有我的 DeepLinkBuilder(没什么特别的,和文档一样)

NavDeepLinkBuilder(requireContext())
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.userProfileFragment)
    .createPendingIntent()
    .send()

【问题讨论】:

【参考方案1】:

您已将包含初始屏幕的 navGraph 设置为默认 startDestination ,当您从嵌套的 navGraph 按下返回按钮时会显示它,我认为最简单的解决方案是执行以下操作: 首先编辑您的导航文件,使其只有一个导航,例如:

<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_graph"
    app:startDestination="@id/splashFragment">

    <fragment
        android:id="@+id/A"
        android:name="A"
        android:label="A" >
        <action
            android:id="@+id/action_A_to_B"
            app:destination="@id/B"
            app:popUpTo="@id/A"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
            android:id="@+id/B"
            android:name="B"
            android:label="B">
            <action
                android:id="@+id/action_B_to_C"
                app:destination="@id/C" />
        </fragment>
        <fragment
            android:id="@+id/C"
            android:name="C"
            android:label="C">
        </fragment>
</navigation>

第二次为 navController 设置一个监听器,以便在目的地更改发生时进行监听,如下所示:

yourNavController.setOnDestinationChangedListener(this);

覆盖 onDestinationChangedListener() 方法并检查即将显示的片段是否为 A ,然后像这样完成应用程序:

@override 
public void onDestinationChanged(NavController controller, NavDestination destination, Bundle arguments)
if(destination.getId()==R.id.splashFragmentId)
finish();


【讨论】:

以上是关于导航组件 NavDeepLinkBuilder 回栈的主要内容,如果未能解决你的问题,请参考以下文章

导航回组件时,ngOnInit 不会再次运行?

如何导航回 Nativescript-vue 中的特定组件或 backstack 条目?

缺少可变性标志:带有 NavDeepLinkBuilder 的 Android 12 待定意图

导航回我的屏幕时如何关闭模式?

当我导航回片段时,片段的内容消失了

重新加载+导航到另一个页面后组件未销毁