Status Update
Comments
lo...@gmail.com <lo...@gmail.com> #2
il...@google.com <il...@google.com>
cl...@google.com <cl...@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:
ap...@google.com <ap...@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.
ap...@google.com <ap...@google.com> #6
This has been fixed and will be available in navigation 2.6.0-alpha08
ap...@google.com <ap...@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
ap...@google.com <ap...@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
ap...@google.com <ap...@google.com> #9
Branch: androidx-main
commit 3323f0d63b410dc7c3e68c7377f520a063e23043
Author: Clara Fok <clarafok@google.com>
Date: Thu Jan 19 16:46:08 2023
Add clearBackStack support for exact routes
NavController.clearBackStack(route) now supports routes with arguments partially or fully filled in, as long as the route is exact match with route used to popBackStack(route).
This method defaults to original behavior of route matching through route pattern. If that fails, it recognizes the provided route as having arguments filled in and will attempt to match with exact arguments.
Test: ./gradlew navigation:navigation-runtime:cC
Bug: 257514373
Relnote: "NavController.clearBackStack(route) now supports routes with arguments partially or fully filled in. Note that the arguments has to be an exact match with the route used to popBackStack(route)."
Change-Id: Ic678cf67db0f47f7b2778b039242773767735f2c
M navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
M navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
ap...@google.com <ap...@google.com> #10
Branch: androidx-main
commit 6609c2dbffca40ed6ae2742efe153409d07c4ae3
Author: Clara Fok <clarafok@google.com>
Date: Thu Jan 19 10:56:04 2023
Refactor helper functions in Navigation
Refactored helper functions NavController.restoreStateInternal and NavDeeplink.hasRoute
Test: n/a
Bug: 257514373
Change-Id: I30e28856b20c1a61a4cb2e6754a675803f81b3c5
M navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
M navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
ap...@google.com <ap...@google.com> #11
Branch: androidx-main
commit 8bac1f9b2b66fbd29277b14bb16cc586c05969ac
Author: Clara Fok <clarafok@google.com>
Date: Thu Jan 19 10:46:44 2023
Updated findDestination and findNode for routes
NavController.findDestination(route) and NavGraph.findNode(route) maintains original behavior of first finding based on route converted to destinationId. But if that fails, it will search based on NavDestination.matchDeepLink.
Refactored existing test toStringStartDestInNodesRouteWithID because it now properly matches with the startDestination.
Test: ./gradlew navigation:navigation-runtime:cC
Bug: 257514373
Change-Id: I2d1c78d459ac3efce485f0b1113cac3348e0cde9
M navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
M navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
M navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
M navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
cl...@google.com <cl...@google.com> #12
This has been fixed internally and will be available in navigation 2.6.0-alpha05
pr...@google.com <pr...@google.com> #13
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-common:2.6.0-alpha05
androidx.navigation:navigation-runtime:2.6.0-alpha05
hu...@lunabee.com <hu...@lunabee.com> #14
Hi, If we have a NavHost like this:
val route = "home?opt={argOpt}"
NavHost(navController = navController, startDestination = route) {
composable(
route = route,
arguments = listOf(
navArgument("opt") {
type = NavType.StringType
nullable = true
defaultValue = null
},
),
)
}
The following methods don't work:
navController.getBackStackEntry("home") // or "home?" or "home?opt=" <- Lead to crash
navController.popBackStack("home", false) } // or "home?" or "home?opt=" <- ignore navigation
However, if we put a default value different than null
, it's working.
Is it possible to popback
to a destination with a default value set to null
?
il...@google.com <il...@google.com> #15
Re "home"
and "home?opt=null"
should work.
Description
Currently, the Navigation APIs that take routes actually use something that is more like a route pattern without any specific arguments that could be used to differentiate the routes. So when you call
getBackStackEntry(route)
orpopBackStack(route)
navigation cannot differentiate between two destinations that may have the same route pattern, but with different arguments.We could add other APIs that take a route pattern instead that maintains the old behavior and change the current APIs to consider the exact route. This would allow Navigation to differentiate between destinations with the same route pattern and different arguments.