我正在开发一个使用 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”:
如果通过单击或按下从 Google Keep 打开链接时可以正常工作,则应用程序应打开并显示 URL 后面的号码所属的 ID 的聊天。
如果您导航至
graph
,请检查您是否已正确设置 startDestination
。
initialRoute
与 AppScreens.ChatScreen.route
匹配吗?startDestination
。检查是否有新版本女巫允许