如何让Android导航组件的Destination在不同的Destinations中膨胀而不被编辑,就好像它们是共享实例一样?

How To Make Destination of Android Navigation Component Inflated in Different Destinations Not Be Edited as If They Were Shared Instances?

情景:

我在我的应用设置中使用 BottomNavigationView 组件和 Android 导航组件。这是一款社交网络应用程序,包含 HomeFeedChallengesMapProfile 作为应用程序的主要目的地。有 2 个目的地(destination_feeddestination_profile) 在其中使用第三个目的地 (navigation_graph_posts)。下图大致显示了场景:

问题:

当我访问destination_profile(仅显示登录用户的帖子)并返回destination_feed, destination_feed[=91上显示的帖子=](以前都是帖子)现在只显示 destination_profile 上显示的相同帖子。我对 profile_destination 的帖子所做的更改似乎反映在 [=66= 的帖子中]feed_destination.

我认为问题是默认情况下,Android 导航组件使用选项 launchSingleTop 将导航图目的地膨胀为 TRUE但我找不到如何将其更改为 FALSE 因为 destination_postsPosts_navigation_graph[ 的 StartDestination =146=]destination_feed[ 中以编程方式膨胀=66=]destination_profile。在我使用的代码下方(减少到重要的部分):

feed_navigation.xml

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

    <fragment
        android:id="@+id/destination_feed"
        android:name="com.jonathan.maxplore.screen.feed.view.FeedFragment"
        android:label="@string/fragment_label_feed"
        tools:layout="@layout/fragment_feed">
        <argument
            android:name="showBottomNavigation"
            android:defaultValue="true" />
    </fragment>
</navigation>

profile_navigation.xml

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

    <fragment
        android:id="@+id/destination_profile"
        android:name="com.jonathan.maxplore.screen.profile.view.ProfileFragment"
        android:label="@string/fragment_label_profile"
        tools:layout="@layout/fragment_profile">
        <argument
            android:name="showBottomNavigation"
            android:defaultValue="true" />
    </fragment>
</navigation>

posts_navigation.xml

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

    <fragment
        android:id="@+id/destination_posts"
        android:name="com.jonathan.maxplore.screen.posts.view.PostsFragment"
        android:label="@string/fragment_label_posts"
        tools:layout="@layout/fragment_posts">
        <argument
            android:name="showAppBar"
            android:defaultValue="true" />

        <argument
            android:name="mode"
            app:argType="com.jonathan.maxplore.util.PostsMode"/>

        <argument
            android:name="identifier"
            android:defaultValue="0L"
            app:argType="long"/>
    </fragment>
</navigation>

fragment_feed.xml

<androidx.fragment.app.FragmentContainerView
            android:id="@+id/fragment_feed_content"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            app:defaultNavHost="true"/>

fragment_profile.xml

<androidx.fragment.app.FragmentContainerView
            android:id="@+id/fragment_profile_content"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            app:defaultNavHost="true"/>

FeedFragment.kt

val extras = arguments
    extras?.putSerializable(ConstantsUtil.Extras.EXTRA_POSTS_MODE, PostsMode.GLOBAL)
    extras?.putBoolean(ConstantsUtil.Extras.EXTRA_BOTTOM_NAVIGATION_ACCESS, true)

    val navHostFragment = (childFragmentManager.findFragmentById(R.id.fragment_feed_content) as NavHostFragment)
    val navGraph = navHostFragment.navController.navInflater.inflate(R.navigation.posts_navigation)
    navHostFragment.navController.setGraph(navGraph, extras)

ProfileFragment.KT

val extras = arguments
    extras?.putSerializable(ConstantsUtil.Extras.EXTRA_POSTS_MODE, PostsMode.MINE)
    extras?.putBoolean(ConstantsUtil.Extras.EXTRA_BOTTOM_NAVIGATION_ACCESS, true)

val navHostFragment = (childFragmentManager.findFragmentById(R.id.fragment_profile_content) as NavHostFragment)
    val navGraph = navHostFragment.navController.navInflater.inflate(R.navigation.posts_navigation)
    navHostFragment.navController.setGraph(navGraph, extras)

非常感谢任何关于如何修复它或什至可能发生的其他事情的建议,以便我可以进一步调查它!提前谢谢你们!

我发现了问题。该问题与 Android 导航组件无关。我还使用 Paging 3,当我刷新帖子片段时,我删除了所有帖子并添加了我从后端收到的帖子的第一页。问题是,当打开用户配置文件时,我正在刷新帖子,这使得所有帖子都被删除,并且只将用户帖子添加到本地数据库中。然后当返回到 Feed 屏幕时,此时数据库中只有来自所选用户的帖子。

问题已解决。谢谢大家