Skip to content

Back handler navigation crash #420

@oleginvoke

Description

@oleginvoke

Describe the bug
When I open the Showkase browser via Showkase.getBrowserIntent(context) everything works fine, but when I press the Back button to return to my app, the app crashes with an exception

It looks like Showkase tries to navigate back to SHOWKASE_CATEGORIES, but the destination is no longer available in the NavController once the Activity has been popped from the back stack.


Steps to reproduce

  1. Create a separate preview module with a ShowkaseRootModule implementation:
   @ShowkaseRoot
   class ShowkaseRoot : ShowkaseRootModule
  1. Create a startPreviewActivity function in the preview module:
fun startPreviewActivity(
    context: Context,
) {
    val intent = Showkase.getBrowserIntent(context)
    context.startActivity(intent)
}
  1. In the app module, add the preview module dependency:
debugImplementation(projects.preview)
  1. In the app module, open Showkase with:
val context = LocalContext.current
Button(
    modifier = Modifier
        .fillMaxWidth(),
    size = Sizes.s32,
    style = ButtonStyle.default,
    text = "previews",
    onClick = {
        startPreviewActivity(context)
    }
)
  1. Press Back to return to the app.

  2. Crash:

else
Exception dispatching finished signal for seq=21
Exception in MessageQueue callback: handleReceiveCallback
java.lang.IllegalArgumentException: Navigation destination that matches request NavDeepLinkRequest{ uri=android-app://androidx.navigation/SHOWKASE_CATEGORIES } cannot be found in the navigation graph ComposeNavGraph(0x0) startDestination={Destination(0x7bb10103) route=COMPONENT_GROUPS}
	at androidx.navigation.NavController.navigate(NavController.kt:1819)
	at androidx.navigation.NavController.navigate(NavController.kt:2225)
	at androidx.navigation.NavController.navigate$default(NavController.kt:2220)
	at com.airbnb.android.showkase.ui.ShowkaseBrowserAppKt$ShowkaseBrowserApp$1$2.invoke$lambda$2$lambda$1$lambda$0(ShowkaseBrowserApp.kt:126)
	at com.airbnb.android.showkase.ui.ShowkaseBrowserAppKt$ShowkaseBrowserApp$1$2.$r8$lambda$Qq3GDYNFZKdQIiZhdRepzNU8H0s(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseBrowserAppKt$ShowkaseBrowserApp$1$2$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.ShowkaseComponentGroupsScreen$lambda$12$lambda$11(ShowkaseGroupsScreen.kt:106)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.$r8$lambda$az9GZkTLuEOzyS_1jM_zIWo2ldA(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt$$ExternalSyntheticLambda10.invoke(D8$$SyntheticClass:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.ShowkaseGroupsScreen$lambda$7$lambda$6$lambda$4(ShowkaseGroupsScreen.kt:58)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.$r8$lambda$yc03hJN6FJo68iVkSKTdYdAzevE(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt$$ExternalSyntheticLambda3.invoke(D8$$SyntheticClass:0)
	at com.airbnb.android.showkase.ui.ShowkaseCategoriesScreenKt.goBackToCategoriesScreen(ShowkaseCategoriesScreen.kt:93)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.ShowkaseGroupsScreen$lambda$7$lambda$6(ShowkaseGroupsScreen.kt:53)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.$r8$lambda$_5ZzVCgKyJrM-QQyvH5yOIN_Fr8(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt$$ExternalSyntheticLambda1.invoke(D8$$SyntheticClass:0)
	at androidx.activity.compose.BackHandlerKt$BackHandler$backCallback$1$1.handleOnBackPressed(BackHandler.kt:89)
	at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.kt:279)
	at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.kt:612)
	at android.app.Activity.onKeyUp(Activity.java:4148)
	at android.view.KeyEvent.dispatch(KeyEvent.java:3053)
	at android.app.Activity.dispatchKeyEvent(Activity.java:4496)
	at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.kt:103)
	at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:85)
	at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.kt:117)
	at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604)
	at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60)
	at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3413)
	at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:360)
	at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:7866)
	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7706)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7106)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7163)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7129)
	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7295)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7137)
	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7352)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7110)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7163)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7129)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7137)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7110)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7163)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7129)
	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7328)
	at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:7554)
	at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:4871)
	at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:4262)
	at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:4253)
	at android.view.inputmethod.InputMethodManager.-$$Nest$mfinishedInputEvent(Unknown Source:0)
	at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:4848)
	at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:181)
	at android.os.MessageQueue.nativePollOnce(Native Method)
	at android.os.MessageQueue.next(MessageQueue.java:346)
	at android.os.Looper.loopOnce(Looper.java:189)
	at android.os.Looper.loop(Looper.java:317)
	at android.app.ActivityThread.main(ActivityThread.java:8705)

                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
Shutting down VM
FATAL EXCEPTION: main
Process: stg.design_system_sample, PID: 23317
java.lang.IllegalArgumentException: Navigation destination that matches request NavDeepLinkRequest{ uri=android-app://androidx.navigation/SHOWKASE_CATEGORIES } cannot be found in the navigation graph ComposeNavGraph(0x0) startDestination={Destination(0x7bb10103) route=COMPONENT_GROUPS}
	at androidx.navigation.NavController.navigate(NavController.kt:1819)
	at androidx.navigation.NavController.navigate(NavController.kt:2225)
	at androidx.navigation.NavController.navigate$default(NavController.kt:2220)
	at com.airbnb.android.showkase.ui.ShowkaseBrowserAppKt$ShowkaseBrowserApp$1$2.invoke$lambda$2$lambda$1$lambda$0(ShowkaseBrowserApp.kt:126)
	at com.airbnb.android.showkase.ui.ShowkaseBrowserAppKt$ShowkaseBrowserApp$1$2.$r8$lambda$Qq3GDYNFZKdQIiZhdRepzNU8H0s(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseBrowserAppKt$ShowkaseBrowserApp$1$2$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.ShowkaseComponentGroupsScreen$lambda$12$lambda$11(ShowkaseGroupsScreen.kt:106)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.$r8$lambda$az9GZkTLuEOzyS_1jM_zIWo2ldA(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt$$ExternalSyntheticLambda10.invoke(D8$$SyntheticClass:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.ShowkaseGroupsScreen$lambda$7$lambda$6$lambda$4(ShowkaseGroupsScreen.kt:58)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.$r8$lambda$yc03hJN6FJo68iVkSKTdYdAzevE(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt$$ExternalSyntheticLambda3.invoke(D8$$SyntheticClass:0)
	at com.airbnb.android.showkase.ui.ShowkaseCategoriesScreenKt.goBackToCategoriesScreen(ShowkaseCategoriesScreen.kt:93)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.ShowkaseGroupsScreen$lambda$7$lambda$6(ShowkaseGroupsScreen.kt:53)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt.$r8$lambda$_5ZzVCgKyJrM-QQyvH5yOIN_Fr8(Unknown Source:0)
	at com.airbnb.android.showkase.ui.ShowkaseGroupsScreenKt$$ExternalSyntheticLambda1.invoke(D8$$SyntheticClass:0)
	at androidx.activity.compose.BackHandlerKt$BackHandler$backCallback$1$1.handleOnBackPressed(BackHandler.kt:89)
	at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.kt:279)
	at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.kt:612)
	at android.app.Activity.onKeyUp(Activity.java:4148)
	at android.view.KeyEvent.dispatch(KeyEvent.java:3053)
	at android.app.Activity.dispatchKeyEvent(Activity.java:4496)
	at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.kt:103)
	at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:85)
	at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.kt:117)
	at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604)
	at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60)
	at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3413)
	at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:360)
	at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:7866)
	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7706)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7106)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7163)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7129)
	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7295)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7137)
	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7352)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7110)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7163)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7129)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7137)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7110)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7163)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7129)
	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7328)
	at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:7554)
	at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:4871)
	at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:4262)
	at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:4253)
	at android.view.inputmethod.InputMethodManager.-$$Nest$mfinishedInputEvent(Unknown Source:0)
	at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:4848)
	at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:181)
	at android.os.MessageQueue.nativePollOnce(Native Method)
	at android.os.MessageQueue.next(MessageQueue.java:346)
	at android.os.Looper.loopOnce(Looper.java:189)
	at android.os.Looper.loop(Looper.java:317)
	at android.app.ActivityThread.main(ActivityThread.java:8705)

                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions