与 ComposeDestinations 一起使用状态数据类

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

我是 android 初学者,也是 jetpack compose 的新手,我最近学习了使用 screenState 数据类和事件接口处理状态/事件,我想知道如何将它们与 compose 目的地一起使用

data class ScreenState(
    val name: String = "",
    val phoneNumber: String = ""
)
sealed interface ContactEvent {

    data class nameTextField(val name: String): ContactEvent
    data class phoneNumberTextField(val phoneNumber: String): ContactEvent
    object saveName: ContactEvent
    object savePhoneNumber: ContactEvent
    data class navigateToPage(val nav: DestinationsNavigator): ContactEvent
}

@RootNavGraph(start = true)
@Destination
@Composable
fun Name(
    nav: DestinationsNavigator,
    state: ScreenState,
    onEvent: (ContactEvent) -> Unit
) {
    Scaffold {
        Box(modifier = Modifier.padding(it)) {
            Column {

                TextField(
                    value = state.name,
                    onValueChange = { text ->
                    onEvent(ContactEvent.nameTextField(text))
                    }
                )

                Button(
                    onClick = {
                        onEvent(ContactEvent.saveName)
                        onEvent(ContactEvent.navigateToPage(nav))
                    }
                ) {
                    Text(text = "Name to DB")
                }
            }
        }
    }
}

这些按顺序排列:状态数据类、事件密封接口、我的撰写屏幕

我得到的错误是

致命异常:主要 进程:com.example.composedestinations,PID:5154 java.lang.RuntimeException:已请求 ScreenState,但它不存在


E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.composedestinations, PID: 5154
                                                                                                    java.lang.RuntimeException: ScreenState was requested, but it is not present
                                                                                                        at com.ramcosta.composedestinations.navigation.DestinationDependenciesContainerImpl.require(DestinationDependenciesContainer.kt:124)
                                                                                                        at com.example.composedestinations.Screens.destinations.NameDestination.Content(NameDestination.kt:48)
                                                                                                        at com.ramcosta.composedestinations.spec.DestinationStyleKt.CallComposable(DestinationStyle.kt:274)
                                                                                                        at com.ramcosta.composedestinations.spec.DestinationStyleKt.access$CallComposable(DestinationStyle.kt:1)
                                                                                                        at com.ramcosta.composedestinations.spec.DestinationStyleKt$addActivityDestination$1.invoke(DestinationStyle.kt:163)
                                                                                                        at com.ramcosta.composedestinations.spec.DestinationStyleKt$addActivityDestination$1.invoke(DestinationStyle.kt:162)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.navigation.compose.NavHostKt$NavHost$14$1.invoke(NavHost.kt:308)
                                                                                                        at androidx.navigation.compose.NavHostKt$NavHost$14$1.invoke(NavHost.kt:306)
                                                                                                        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.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
                                                                                                        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.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
                                                                                                        at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:306)
                                                                                                        at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:295)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:755)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:744)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.compose.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:818)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:726)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:709)
                                                                                                        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.animation.AnimatedContentKt.AnimatedContent(AnimatedContent.kt:768)
                                                                                                        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:273)
                                                                                                        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:128)
                                                                                                        at com.ramcosta.composedestinations.DefaultNavHostEngine.NavHost(DefaultNavHostEngine.kt:79)
2024-03-29 04:14:41.005  5154-5154  AndroidRuntime          com.example.composedestinations      E      at com.ramcosta.composedestinations.DestinationsNavHostKt.DestinationsNavHost(DestinationsNavHost.kt:71)
                                                                                                        at com.example.composedestinations.ComposableSingletons$MainActivityKt$lambda-1$1.invoke(MainActivity.kt:32)
                                                                                                        at com.example.composedestinations.ComposableSingletons$MainActivityKt$lambda-1$1.invoke(MainActivity.kt:31)
                                                                                                        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.material3.SurfaceKt$Surface$1.invoke(Surface.kt:132)
                                                                                                        at androidx.compose.material3.SurfaceKt$Surface$1.invoke(Surface.kt:114)
                                                                                                        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.SurfaceKt.Surface-T9BRK9s(Surface.kt:111)
                                                                                                        at com.example.composedestinations.ComposableSingletons$MainActivityKt$lambda-2$1.invoke(MainActivity.kt:28)
                                                                                                        at com.example.composedestinations.ComposableSingletons$MainActivityKt$lambda-2$1.invoke(MainActivity.kt:26)
                                                                                                        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.TextKt.ProvideTextStyle(Text.kt:360)
                                                                                                        at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81)
                                                                                                        at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80)
                                                                                                        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:73)
                                                                                                        at com.example.composedestinations.ui.theme.ThemeKt.ComposeDestinationsTheme(Theme.kt:65)
                                                                                                        at com.example.composedestinations.ComposableSingletons$MainActivityKt$lambda-3$1.invoke(MainActivity.kt:26)
                                                                                                        at com.example.composedestinations.ComposableSingletons$MainActivityKt$lambda-3$1.invoke(MainActivity.kt:25)
                                                                                                        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)
2024-03-29 04:14:41.006  5154-5154  AndroidRuntime          com.example.composedestinations      E      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:723)
                                                                                                        at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1071)
                                                                                                        at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:631)
                                                                                                        at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:617)
                                                                                                        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:20479)
                                                                                                        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3489)
                                                                                                        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496)
                                                                                                        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496)
                                                                                                        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496)
                                                                                                        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496)
                                                                                                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2417)
                                                                                                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
                                                                                                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
                                                                                                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
                                                                                                        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
                                                                                                        at android.view.Choreographer.doFrame(Choreographer.java:731)
                                                                                                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loop(Looper.java:223)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7656)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

好吧,因为我是新手,所以我还没有真正尝试过任何东西

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

将您的 ScreenState 数据类标记为 Parcelable,我们不能直接将数据类作为参数发送。

将以下插件添加到各自的 gradle 文件中。

// project level gradle
plugins {
    ..
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

//app level gradle
plugins {
    ..
    id("kotlin-parcelize")
}

现在同步您的项目并将数据类标记为 Parcelable 类,如下所示,

@Parcelize
data class ScreenState(
    val name: String = "",
    val phoneNumber: String = ""
) : Parcelable
© www.soinside.com 2019 - 2024. All rights reserved.