Status Update
Comments
ma...@gmail.com <ma...@gmail.com> #2
Oh I forgot to mention that I thought it might be connected to this issue:
il...@google.com <il...@google.com> #3
Please provide a minimal sample project along with the minimal steps to recreate the issue in the project.
ap...@google.com <ap...@google.com> #4
Sorry for the delay. I got a working example here:
I poked into it a little bit and it seems to be connected to
Steps to reproduce:
- Navigate from Second Fragment to Child nav graph (with non-nullable parameters).
- Navigate to Third fragment using SafeArgs and the app crashes.
Crash log:
Process: cz.dels.issues, PID: 1743
java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Long
at androidx.navigation.NavType$Companion$LongType$1.get(NavType.kt:352)
at androidx.navigation.NavType$Companion$LongType$1.get(NavType.kt:342)
at androidx.navigation.NavArgument.verify(NavArgument.kt:76)
at androidx.navigation.NavDestination.addInDefaultArgs(NavDestination.kt:502)
at androidx.navigation.NavController.addEntryToBackStack(NavController.kt:1865)
at androidx.navigation.NavController.addEntryToBackStack$default(NavController.kt:1813)
at androidx.navigation.NavController$navigate$4.invoke(NavController.kt:1721)
at androidx.navigation.NavController$navigate$4.invoke(NavController.kt:1719)
at androidx.navigation.NavController$NavControllerNavigatorState.push(NavController.kt:287)
at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:246)
at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:162)
at androidx.navigation.NavController.navigateInternal(NavController.kt:260)
at androidx.navigation.NavController.navigate(NavController.kt:1719)
at androidx.navigation.NavController.navigate(NavController.kt:1545)
at androidx.navigation.NavController.navigate(NavController.kt:1472)
at androidx.navigation.NavController.navigate(NavController.kt:1930)
at cz.dels.issues.SecondFragment.onViewCreated$lambda-0(SecondFragment.kt:38)
at cz.dels.issues.SecondFragment.$r8$lambda$XDYnOS_cYrafiNQ5rcCu1WCn0IE(Unknown Source:0)
at cz.dels.issues.SecondFragment$$ExternalSyntheticLambda0.onClick(Unknown Source:2)
Note: If in step 2 SaveArgs is not used then navigation works correctly. More information is here:
il...@google.com <il...@google.com> #5
Ups a typo: Navigate from Second First Fragment to Child nav graph (with non-nullable parameters).
Note: sorry for the spam but I am not able to edit my own comment.
ma...@gmail.com <ma...@gmail.com> #6
This has been fixed and will be available in navigation 2.6.0-alpha08
il...@google.com <il...@google.com> #7
Branch: androidx-main
commit 6b358154b794a0456b089ac8e548bfb830dd6c22
Author: Clara Fok <clarafok@google.com>
Date: Tue Mar 14 17:56:12 2023
Fix missing non-nullable arg when rebuilding hierarchy
When navigating with NavDirections, args is populated with an empty bundle. This causes issue when we rebuild parent hierarchy while adding a new entry to NavBackStack. If the Entry being rebuilt contains a non-nullalbe arg, i.e. Long, this empty bundle will cause an exception.
Test: ./gradlew navigation:navigation-runtime:cC
Bug: 249988437
Change-Id: I5c8ce739ad9a3428c8a8de13eae391bfff0db5df
M navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
M navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
an...@google.com <an...@google.com> #8
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-runtime:2.6.0-alpha08
rc...@olx.ph <rc...@olx.ph> #9
Hello, does anyone know the timeline when to release version 2.3.0-alpha05
? Unfortunately we are also encountering this crash in our app. Thank you.
il...@google.com <il...@google.com> #10
rc...@olx.ph <rc...@olx.ph> #11
The crash is gone now, thank you!
ja...@gmail.com <ja...@gmail.com> #12
After upgrading to 2.2.2 i have crash on finding graph.
I/NavController: Could not find destination com.my.app:id/main_navigation in the navigation graph, ignoring the deep link from Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x1040c000 pkg=com.my.app cmp=com.my.app/com.my.app.MainActivity (has extras) }
This is simple deep link to specified fragment. We have nested NavHostFragment
. The fragment i'm deep linking to is in PARENT GRAPH, not the nested one. MainPageFragment
have the nested NavHostFragment
in it, so i guess the graph found is the nested one and so - does not match one that we are looking for.
<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_navigation"
app:startDestination="@id/intro_navigation">
<fragment
android:id="@+id/mainPageFragment"
android:name="com.my.app.MainPageFragment"
android:label="MainPageFragment">
<argument
android:name="fromNotification"
android:defaultValue="false"
app:argType="boolean" />
</fragment>
</navigation>
I created this deep link by builder:
NavDeepLinkBuilder(context)
.setGraph(R.navigation.main_navigation)
.setDestination(R.id.mainPageFragment)
.setArguments(bundleOf("fromNotification" to true))
.createPendingIntent()
il...@google.com <il...@google.com> #13
Re #12 - please file a new bug with a sample project that reproduces your issue. It would be expected that you'd see at least one log message if you have nested NavHostFragment
instances with different graphs (the nested graph would ignore deep links to the outer one, as expected).
ja...@gmail.com <ja...@gmail.com> #14
I think that this code breaks down:
NavDestination node = i == 0
? (mGraph.getId() == destinationId ? mGraph : null)
: graph.findNode(destinationId, false);
For some reason it assumes that first deeplink have to be in current mGraph
. Shouldn't it always scan all graphs to look for proper node?
ja...@gmail.com <ja...@gmail.com> #15
I have 2 of such logs, each for every graph. I will try to create project that reproduces this and create new bug
Description
Version used: 2.2.0-rc03
Devices/Android versions reproduced on: can't reproduce
I have a few crash reports about this exceptions, that I can't reproduce in normal conditions and I wonder if this is some corner-case bug.
Stacktrace:
Fatal Exception: java.lang.IllegalStateException: unknown destination during deep link: com.app:id/nav_graph_main
at androidx.navigation.NavController.handleDeepLink(NavController.java:660)
at androidx.navigation.NavController.onGraphCreated(NavController.java:573)
at androidx.navigation.NavController.setGraph(NavController.java:534)
at androidx.navigation.NavController.setGraph(NavController.java:514)
at com.app.view.HomeFragment.prepareNestedNavHost(HomeFragment.java:65)
at com.app.view.HomeFragment.onViewCreated(HomeFragment.java:50)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:304)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1227)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2373)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2108)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2064)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1960)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:418)
I have a main NavHostFragment, hosted in my MainActivity, that owns the "nav_graph_main" graph.
HomeFragment is a destination of "nav_graph_main" and it contains a second NavHost (the "nested" NavHost) to manage navigation between several subscreens together with a BottomNavigationBar (HomeFragment's layout is a NavHostFragment above a BottomNavigatonBar).
The graph of the "nested" navigation ("nav_graph_home") is a separate resource, with no link to the outer "nav_graph_main" graph.
I need to programmatically set the nested graph to the nested NavController, because the start destination practically depends on which bottom navigation tab I want to be selected first.
Therefore, in HomeFragment's onViewCreated, I call the following prepareNestedNavHost:
fun prepareNestedNavHost() {
val startDestination = args.startDestination
val navHostFragment = childFragmentManager.findFragmentById(R.id.navHostHome) as? NavHostFragment
navHostFragment?.navController?.apply {
// I have no other way to know if the graph is not set:
kotlin.runCatching { this.graph }.onFailure {
val nestedGraph = navInflater.inflate(R.navigation.nav_graph_home)
graph.startDestination = startDestination
this.graph = nestedGraph
}
}
}
The only potential reason that came out of my mind is that the nested NavController, sharing the same Activity with the outer NavController, might end up handling an Intent directed to the latter. Is this working as intended?