如何解决致命异常:java.util.NoSuchElementException 序列为空。使用 deepLinks 时在 jetpack compose 中进行导航

问题描述 投票:0回答:1

我正在开发一个使用 jetpack compose 的 Android 聊天应用程序,该应用程序有一个 NavHost,在某些可组合项中带有一些深层链接,当从浏览器或聊天应用程序打开链接时,应该打开深层链接后面的屏幕,但它不起作用,并且出现以下错误:

Fatal Exception: java.util.NoSuchElementException: Sequence is empty.
       at kotlin.sequences.SequencesKt___SequencesKt.last(_Sequences.kt:244)
       at androidx.navigation.NavGraph$Companion.findStartDestination(NavGraph.kt:417)
       at androidx.navigation.NavController$handleDeepLink$2.invoke(NavController.kt:1428)
       at androidx.navigation.NavController$handleDeepLink$2.invoke(NavController.kt:1416)
       at androidx.navigation.NavOptionsBuilderKt.navOptions(NavOptionsBuilder.kt:30)
       at androidx.navigation.NavController.handleDeepLink(NavController.kt:1416)
       at androidx.navigation.NavController.onGraphCreated(NavController.kt:1283)
       at androidx.navigation.NavController.setGraph(NavController.kt:1199)
       at androidx.navigation.NavController.setGraph(NavController.kt:100)
       at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:206)
       at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:128)
       at com.perfect.you.navigation.AppNavigationKt.AppNavigation(AppNavigation.kt:49)
       at com.perfect.you.navigation.NavigationClass.Host(NavigationClass.kt:46)
       at com.perfect.you.MainActivity$onCreate$3$1.invoke(MainActivity.kt:66)
       at com.perfect.you.MainActivity$onCreate$3$1.invoke(MainActivity.kt:65)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248)
       at androidx.compose.material3.TextKt.ProvideTextStyle(Text.kt:352)
       at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:72)
       at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:71)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
       at androidx.compose.material3.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:64)
       at com.perfect.you.ui.theme.ComposeThemeKt.YouTheme(ComposeTheme.kt:58)
       at com.perfect.you.MainActivity$onCreate$3.invoke(MainActivity.kt:65)
       at com.perfect.you.MainActivity$onCreate$3.invoke(MainActivity.kt:61)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:428)
       at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252)
       at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
       at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:186)
       at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:119)
       at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:118)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
       at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:110)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:139)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:138)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:138)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:123)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
       at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
       at androidx.compose.runtime.ActualJvm_jvmKt.invokeComposable(ActualJvm.jvm.kt:90)
       at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3302)
       at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:3235)
       at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:725)
       at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1071)
       at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633)
       at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:123)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:1289)
       at androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:164)
       at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:322)
       at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:199)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:1364)
       at android.view.View.dispatchAttachedToWindow(View.java:21357)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3491)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3498)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3498)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3498)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3498)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2900)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9301)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
       at android.view.Choreographer.doCallbacks(Choreographer.java:899)
       at android.view.Choreographer.doFrame(Choreographer.java:832)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
       at android.os.Handler.handleCallback(Handler.java:942)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:7959)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)

这是我的导航主机:

NavHost(
   navController = navController,
   startDestination = initialRoute
) {
   composable(
                route = AppScreens.ChatScreen.route + "/{${NavArgumentKeys.chatId}}" + "?${NavArgumentKeys.newChat}={${NavArgumentKeys.newChat}}",
                arguments = listOf(
                    navArgument(NavArgumentKeys.chatId) { type = NavType.IntType },
                    navArgument(NavArgumentKeys.newChat) { type = NavType.BoolType; defaultValue = false }
                ),
                deepLinks = listOf(
                    navDeepLink {
                        uriPattern = "https://example.com/{${NavArgumentKeys.chatId}}"
                        action = Intent.ACTION_VIEW
                    }
                ),
            ) {
                val chatId = it.arguments?.getInt(NavArgumentKeys.chatId)
                val newChat = it.arguments?.getBoolean(NavArgumentKeys.newChat)

                val chatViewModel = hiltViewModel<ChatViewModel, ChatViewModel.ChatViewModelFactory>(key = chatId.toString()) {
                    factory -> factory.create(chatId!!, newChat!!)
                }

                ChatScreen(
                    viewModel = chatViewModel,
                    preferences = preferences,
                )
            }
}

这是 Android 清单:

<application android:name=".PerfectYou"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/icon_1"
        android:label="@string/AppName"
        android:supportsRtl="true"
        android:theme="@style/Theme.PerfectYou.SplashScreen"
        android:enableOnBackInvokedCallback="true"
        tools:targetApi="34">

        <activity android:name=".MainActivity"
            android:exported="true"
            android:launchMode="standard"
            android:windowSoftInputMode="adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <data android:host="example.com" android:scheme="https" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

</application>

我尝试通过以下方式从 Google Keep 打开此链接“https://example.com/0”:

  1. 一键打开:它在 Google Keep 顶部打开,但打开正确。
  2. 按住并打开:它会打开一个新窗口,半秒后应用程序将关闭(不加载内容)。

如果通过单击或按下从 Google Keep 打开链接时可以正常工作,则应用程序应打开并显示 URL 后面的号码所属的 ID 的聊天。

kotlin android-jetpack-compose android-jetpack-navigation
1个回答
0
投票

如果您导航至

graph
,请检查您是否已正确设置
startDestination

  1. initialRoute
    AppScreens.ChatScreen.route
    匹配吗?
  2. Jetpack 不允许将参数传递给
    startDestination
    。检查是否有新版本女巫允许
© www.soinside.com 2019 - 2024. All rights reserved.