Status Update
Comments
il...@google.com <il...@google.com>
nd...@gmail.com <nd...@gmail.com> #2
Specifically, see
Also mentioned is the fact that you can override createFragmentNavigator(), call navController.navigatorProvider.addNavigator() there, then return super.createFragmentNavigator().
st...@gmail.com <st...@gmail.com> #3
interface DynamicNode {
@IdRes
fun getDestination(context: Context, @IdRes destinationIn: Int, argsIn: Bundle?) : Int
}
The Navigator then implements a navigate method that simply calls NavController.navigate using the ID returned by the DynamicNode and returns null, essentially performing a redirect. It would be cool to see something like this baked-in with a later version of the Navigation component.
ap...@google.com <ap...@google.com> #4
Ah gotcha. Okay that's a nicer then. Thanks!
cl...@google.com <cl...@google.com> #5
Branch: androidx-master-dev
commit 238c09170a34e1c94af42bc3c6e9fce551883aef
Author: Ian Lake <ilake@google.com>
Date: Mon Apr 22 12:54:51 2019
Rename createFragmentNavigator()
Fix confusion around what method should
be overriden to add custom Navigators to
a NavHostFragment.
Test: tested in testapp
Fixes: 122802849
Change-Id: I969dca429a62e0533cb4ca93c77e68e062278a6f
M navigation/fragment/api/2.1.0-alpha03.txt
M navigation/fragment/api/current.txt
M navigation/fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
st...@gmail.com <st...@gmail.com> #6
This will be available in Navigation 2.1.0-alpha03
st...@gmail.com <st...@gmail.com> #7
Very good point made by Ian, adding @androidx.annotation.Keep
to the enum makes it not crash again, since r8 no longer mangles the name, and serialization and the real name then start matching again.
cl...@google.com <cl...@google.com> #8
Re:
I git cloned your main branch from
Tried running as is, with SomeEnum
nested inside B
, no crashes. I then moved your enum class out of B
@Serializable
data class B(val someEnum: SomeEnum)
enum class SomeEnum {
A, B;
}
So now its using snapshot, minified = true, top level Enum, no crashes.
cl...@google.com <cl...@google.com> #9
Ah yes I see the crash in release build. As Ian recommended, use @androidx.annotation.Keep
or else the class gets removed.
st...@gmail.com <st...@gmail.com> #10
Created a new issue
ap...@google.com <ap...@google.com> #11
Branch: androidx-main
commit 6187e05a8c1892c1679aa4571e5a5d6ffb9663e8
Author: Clara Fok <clarafok@google.com>
Date: Fri Aug 09 09:26:44 2024
Improve error message for Enum type
Navigation added built-in support for Enums in type safety. Due to limited metadata without kotlin reflect, the implementation relies on the Enum's serialName to match the Enum class's fqn.
However, if r8 minifed build is employed in release builds, it is possible that the fqn is modified. Kotlinx serialization is not aware of this, however, and the serialName would remain the same. This means navigation won't be able to match the serialName to the new fqn.
The current solution is to add @androidx.annotation.Keep on enum classes to ensure it doesn't get erased. We should update the exception message to suggest this as a possible solution.
Test: ./gradlew navigation:navigation-common:cC
Bug: 358137294
Relnote: "Update Enum class not found exception to suggest using @Keep annotation in case the Enum class gets erased in minified builds."
Change-Id: I90e79cc476c21ab0ad3b172af65c436817665ef7
M navigation/navigation-common/src/main/java/androidx/navigation/serialization/NavTypeConverter.kt
M navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
na...@google.com <na...@google.com> #12
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-common:2.8.0-rc01
androidx.navigation:navigation-runtime:2.8.0-rc01
sa...@outlook.com <sa...@outlook.com> #13
Looks like the above suggestion to update the exception to add the Keep annotation would be a good idea.
ch...@gmail.com <ch...@gmail.com> #14
@Serializable
data class NewReservationDetails(val usage: Usage) {
companion object {
val typeMap = mapOf(typeOf<Usage>() to NavType.EnumType<Usage>(Usage::class.java))
fun from(savedStateHandle: SavedStateHandle) =
savedStateHandle.toRoute<Usage>(typeMap)
}
}
composable<NewReservationDetails>(
enterTransition = { expandHorizontally() },
exitTransition = { shrinkHorizontally() },
typeMap = NewReservationDetails.typeMap
) { backStackEntry ->
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(NewReservation)
}
val parentViewModel: OrderRideHostViewModel = hiltViewModel(parentEntry)
val viewModel: OrderRideAddressDateViewModel = hiltViewModel()
NewReservationDetailsScreen(
orderRideAddressDateViewModel = viewModel,
orderRideHostViewModel = parentViewModel
)
}
)
class OrderRideAddressDateViewModel @Inject constructor(
val savedStateHandle: SavedStateHandle,
) : ViewModel() {
private val usage = NewReservationDetails.from(savedStateHandle)
}
I'm still having the crash, i've tried a lot of thing :(
java.lang.IllegalArgumentException: Cannot cast PERSO of type com.wimova.domain.model.Usage.PERSO to a NavType. Make sure to provide custom NavType for this argument.
il...@google.com <il...@google.com> #15
Re
na...@google.com <na...@google.com> #16
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-common:2.9.0-alpha01
ca...@digitalchargingsolutions.com <ca...@digitalchargingsolutions.com> #17
As a rule of thumb I try to avoid using @Keep
, because sooner or later someone will forget to add it. Instead, in my opinion it's better to add a proguard rule to "keep" the information for all future usages as well.
I am using this now and it solved the crash. Would it maybe make sense to ship the library with this or to reference it, as an alternative to using @Keep
?
Edit: Actually Serializable is not needed for the enum, but imo this is an okay solution.
Variant 1:
-keep @kotlinx.serialization.Serializable enum * { *; }
Variant 2:
# Keep child enums of classes tagged with @Serializable.
-if @kotlinx.serialization.Serializable class ** { *; }
-keep enum * { *; }
Description
Component used: Navigation Version used: Version 2.8.0-beta07 Devices/Android versions reproduced on: Pixel 6Pro Android14 The release notes for Version 2.8.0-beta07 state that there is not need to explicitly provide a typeMap for Enum classes but the App crashes on startup but works as expected if the typeMap is provided or the enum class is nested inside the destination serializable data class.
this one works
but this one fails
If this is a bug in the library, we would appreciate if you could attach: