当配置发生更改并且我的Activity和Fragment因此被重新创建时,我的nav Graph作用域ViewModel不可用,而Fragment已经被重新创建。
片段似乎在navGraph之前被重新创建。
我使用这段代码从我的Fragment初始化我的navGraph作用域ViewModel:
private val myViewModel: MyViewModel by navGraphViewModels(R.id.nav_graph_id)
如果我尝试在Fragments onViewCreated
函数中使用myViewModel
,我在配置更改后得到一个IllegalArgumentException
。
java.lang.IllegalArgumentException: No destination with ID <destination id> is on the NavController's back stack
我该怎么办?
I have already checked that my ID isn't used anywhere else.
编辑1:
下面是我的activity_main. xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/main_nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:navGraph="@navigation/main_nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
下面是我的main_nav_graph.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/main_nav_graph"
app:startDestination="@id/main_nav_graph_1">
<navigation
android:id="@+id/main_nav_graph_1"
android:label="@string/nav_graph_1_label"
app:startDestination="@id/nav_graph_1_start_fragment">
<!-- nav graph stuff -->
</navigation>
<navigation
android:id="@+id/main_nav_graph_2"
android:label="@string/nav_graph_2_label"
app:startDestination="@id/nav_graph_2_start_fragment">
<fragment
android:id="@+id/nav_graph_2_start_fragment"
android:label="@string/nav_graph_2_start_fragment_label"
android:name="my.package.ui.NavGraph2StartFragment"
tools:layout="@layout/fragment_nav_graph_2_start">
</fragment>
<!-- In here is where I get the problem -->
</navigation>
</navigation>
4条答案
按热度按时间fivyi3re1#
对于来到这里的其他人,我在当前显示对话框时遇到了这个问题,我在对话框关闭之前向使用
by navGraphViewModels()
的片段发出了navController.navigate()调用。这就好像导航库无法理解在显示对话框时是否存在具有该ID的目的地。
为了更清楚起见,这个对话框是使用导航图XML中的
<dialog>
属性显示的。我的修复方法(目前)是确保在通过
view.postDelayed({ navController.navigate(elsewhere)}, 300)
进行进一步调用以导航到其他位置之前关闭对话框这不是我第一次遇到NavController在显示对话框时尝试导航的问题。
llew8vvj2#
我的问题如下:
配置更改后,NavGraph返回其起始目的地,但最后激活的片段仍被加载。这意味着实际启动的片段与navGraph的当前目的地不同步。
当我的Fragment尝试加载navGraph作用域的ViewModel时,它失败了,因为navGraph认为它在不同的Fragment上,而实际上它在不同的Fragment上。
为了解决我的问题,我不得不使用活动savedInstanceState
Bundle
保存并恢复navController的状态。(源代码:https://stackoverflow.com/a/59987336)bqujaahr3#
我的问题是我在导航图和包含的导航图中定义了相同id的片段。
yqlxgs2m4#
通过更改此选项轻松解决:
收件人: