Status Update
Comments
il...@google.com <il...@google.com> #2
Is this specific to navigation? Or can this be reproduced with another other Composable component?
[Deleted User] <[Deleted User]> #3
It only happens inside of a NavHost. So, yes, it seems to be specific to navigation.
il...@google.com <il...@google.com> #4
This was caused by the fix to BackHandler
lifecycle aware. The problem here is that the NavController
registers its lifecycle and added an observer to the Activity
Lifecycle
in composition while the BackHandler
registers its observer on the Activity
Lifecycle
in a DisposbleEffect
. This means that the NavController
will always get Lifecycle callbacks before the BackHandler
, so the components listening the the NavController
's lifecycle (like the NavBackStackEntry) will always get their Lifecycle callbacks before the BackHandler
as well.
This should be addressed by work coming in 2.7 to integrate the BackHandler
into the NavHost
.
ap...@google.com <ap...@google.com> #5
Branch: androidx-main
commit d2c5efe67531a30fb9f1a129d52beb1e9ece0b29
Author: Jeremy Woods <jbwoods@google.com>
Date: Wed May 31 23:09:54 2023
Integrate BackHandler into NavHost
Instead of NavHost taking over the onBackPressedDispatcher from the
Activity, we should just make it use a BackHandler. This will ensure
that it interacters with the other BackHandlers in Compose correctly.
RelNote: "`NavHost` now correctly intercepts system back calls even
after the Activity has been `STOPPED` and `RESUMED`."
Test: modified tests
Bug: 279118447
Change-Id: Icb6deab996d122487243f0d3d775af8c15fc7c25
M navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
M navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
il...@google.com <il...@google.com> #6
This has been fixed internally and will be available in Navigation 2.7.0-beta01.
Description
Version used: 1.0.0-alpha11
Devices/Android versions reproduced on: irrelevant
I have a fragment like this:
<fragment
android:id="@+id/teamDetailFragment"
android:name="com.optima_apps.fkcz.ui.team.teamdetail.TeamDetailFragment"
android:label="{player_name}" <== PARAMETRIZED LABEL (from a plain string argument)
tools:layout="@layout/fragment_team_detail">
<argument
android:name="player"
app:argType="com.optima_apps.fkcz.models.Player" /> <== CUSTOM CLASS ARG TYPE
<argument
android:name="player_name"
app:argType="string" />
</fragment>
When parametrized label is used in combination with custom class argument type on a fragment, the app crashes when activity is recreated with a saved instance state. To reproduce, have a fragment configured as shown above, then in Developer Options enable "Don't keep activites" to force activity to destroy as soon as you leave it, then return to activity and it should crash like below:
2019-02-05 12:57:22.012 5790-5790/com.optima_apps.fkcz E/Parcel: Class not found when unmarshalling: com.optima_apps.fkcz.models.Player
java.lang.ClassNotFoundException: com.optima_apps.fkcz.models.Player
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at android.os.Parcel.readParcelableCreator(Parcel.java:2489)
at android.os.Parcel.readParcelable(Parcel.java:2443)
at android.os.Parcel.readValue(Parcel.java:2346)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2698)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.BaseBundle.containsKey(BaseBundle.java:345)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:90)
at androidx.navigation.ui.ToolbarOnDestinationChangedListener.onDestinationChanged(ToolbarOnDestinationChangedListener.java:57)
at androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:218)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:292)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:241)
at com.optima_apps.fkcz.FKCZActivity.onCreate(FKCZActivity.kt:41)
at android.app.Activity.performCreate(Activity.java:6915)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.ClassNotFoundException: com.optima_apps.fkcz.models.Player
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at android.os.Parcel.readParcelableCreator(Parcel.java:2489)
at android.os.Parcel.readParcelable(Parcel.java:2443)
at android.os.Parcel.readValue(Parcel.java:2346)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2698)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.BaseBundle.containsKey(BaseBundle.java:345)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:90)
at androidx.navigation.ui.ToolbarOnDestinationChangedListener.onDestinationChanged(ToolbarOnDestinationChangedListener.java:57)
at androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:218)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:292)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:241)
at com.optima_apps.fkcz.FKCZActivity.onCreate(FKCZActivity.kt:41)
at android.app.Activity.performCreate(Activity.java:6915)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
I have already Googled this a bit and this could be the solution:
When I change the label to be a static string, the library never goes into part of code that's crashing, and everything works properly, so I'm sure the issue is not on my side.
If you need any additional info I'm here.