首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Jetpack撰写导航应用程序停止?

为什么我的Jetpack撰写导航应用程序停止?
EN

Stack Overflow用户
提问于 2022-10-11 21:15:13
回答 1查看 53关注 0票数 1

我在练习构图导航。我创建了一个应用程序,该应用程序在我所称的SuccessScreen上显示带有图像的行,当单击某个特定项时,它导航到包含更多信息/详细信息的目的地,我称之为SuccessInfoScreen。为此,我使用了导航组合Arugments。我基本上是通过对Android开发者Rally创作进行基准测试来做到这一点的,包括Tab Row特性。

请表现出一些理解和耐心,我对此有点陌生。

但问题是,当我单击一个项目来导航到应用程序停止的SuccessScreen 时,会停止。--我不知道是什么导致了它,也不知道如何修复它--当我对SuccessScreen进行更改时,它就开始了。

所以我相信问题来自SuccessScreen (记住,我说过这是我导航的目的地)。

我将发布SuccessScreen的代码,这会产生错误,而不是SuccessInfoScreen,因为我不知道代码会更长。

请理解,我安排的代码,以多种组合,以这种格式;

FirstBodyElement -> FirstBodyRow

SecondBodyElement -> SecondBodyGrid

最后,我在SuccessContentScreen上调用SuccessScreen

请让我及时谈谈我所做的改变,因为我认为这与此有关。

FirstBodyElement;

代码语言:javascript
复制
@Composable
fun FirstBodyElement(
    successInfo: SuccessInfoData,
    onSuccessCardClick: (SuccessInfoData) -> Unit
) {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .clickable { onSuccessCardClick(successInfo) }
    ) {
        Image(
            painter = painterResource(successInfo.successInfoImageId),
            contentDescription = null,
            contentScale = ContentScale.Crop,
            modifier = Modifier
                .size(88.dp)
                .clip(RoundedCornerShape(16.dp))
        )

        Text(
            text = successInfo.title,
            style = MaterialTheme.typography.h3,
            modifier = Modifier.paddingFromBaseline(
                top = 24.dp, bottom = 8.dp
            )
        )
    }
}

FirstBodyRow;

代码语言:javascript
复制
@Composable
fun FirstBodyRow(
    successInfo: List<SuccessInfoData>,
    onSuccessCardClick: (SuccessInfoData) -> Unit,
) {
    LazyRow(
        horizontalArrangement = Arrangement.spacedBy(8.dp),
        contentPadding = PaddingValues(horizontal = 16.dp),
        modifier = Modifier
    ) {
        items(
            items = successInfo,
            itemContent = {
                FirstBodyElement(it, onSuccessCardClick)
            }
        )
    }
}

这(FirstBodyRow)是我开始进行更改的地方,我将SuccessInfoData变成List (FirstBodyRow的参数),所以它变成了successInfo: List<SuccessInfoData>,当然,对于SecondBodyGridSuccessContentScreenSuccessScreen,我也是这样做的。我这样做是因为FirstBodyRowSecondBodyGrid中的项显示了错误,error: None of the following functions can be called with the arguments supplied.,但是当我将参数作为List传递时,这个错误就消失了。

SecondBodyElement;

代码语言:javascript
复制
@Composable
fun SecondBodyElement(
    successInfo: SuccessInfoData,
    onSuccessCardClick: (SuccessInfoData) -> Unit
) {
    Surface(
        shape = MaterialTheme.shapes.small,
        modifier = Modifier
            .clickable { onSuccessCardClick(successInfo) }
    ) {
        Row(
            verticalAlignment = Alignment.CenterVertically,
            modifier = Modifier
                .width(192.dp)
        ) {
            Image(
                painter = painterResource(successInfo.successInfoImageId),
                contentDescription = null,
                contentScale = ContentScale.Crop,
                modifier = Modifier
                    .size(56.dp)
            )
            Text(
                text = successInfo.title,
                style = MaterialTheme.typography.h3,
                modifier = Modifier.padding(horizontal = 16.dp)
            )
        }

    }
}

SecondyBodyGrid;

代码语言:javascript
复制
@Composable
fun SecondBodyGrid(
    successInfo: List<SuccessInfoData>,
    onSuccessCardClick: (SuccessInfoData) -> Unit = {},
) {
    LazyHorizontalGrid(
        rows = GridCells.Fixed(2),
        contentPadding = PaddingValues(horizontal = 16.dp),
        horizontalArrangement = Arrangement.spacedBy(8.dp),
        verticalArrangement = Arrangement.spacedBy(8.dp),
        modifier = Modifier.height(120.dp)
    ) {
        items(
            items = successInfo,
            itemContent = {
                SecondBodyElement(it, onSuccessCardClick)
            }
        )
    }
}

SuccessContentScreen;

代码语言:javascript
复制
@Composable
fun SuccessContentScreen(
    modifier: Modifier = Modifier,
    onSuccessCardClick: (List<SuccessInfoData>) -> Unit,
    accountType: String? = SuccessInfoModel.successInfoModelList.first().title
) {

    //val successInfo = remember(accountType) { SuccessInfoModel.getSuccessInfo(accountType) }
    val successInfo = remember(accountType) { SuccessInfoModel.successInfoModelList }

    Column(
        modifier
            .verticalScroll(rememberScrollState())
            .padding(vertical = 16.dp)
    ) {
        SuccessQuote()
        SuccessTitleSection(title = R.string.women_between_18_39) {
            FirstBodyRow(successInfo) { onSuccessCardClick(successInfo) }
        }
        SuccessTitleSection(title = R.string.women_40) {
            SecondBodyGrid(successInfo) { onSuccessCardClick(successInfo) }
        }
    }
}

最后是SuccessScreen;

代码语言:javascript
复制
@Composable
fun SuccessScreen(onSuccessCardClick: (List<SuccessInfoData>) -> Unit) {
    SuccessContentScreen(onSuccessCardClick = onSuccessCardClick)
}

我还将NavHost中的一个函数更改为列表

代码语言:javascript
复制
private fun NavHostController.navigateToSuccessInfoScreen(accountType: List<SuccessInfoData>) {
    this.navigateSingleTopTo("${SuccessInfoDestination.route}/$accountType")
}

我打算用它来导航到SuccessInfoScreen。

要了解更多信息,我将添加以下内容;

代码语言:javascript
复制
....
    fun getSuccessInfo(accountName: String?): SuccessInfoData {
            return successInfoModelList.first { it.title == accountName }
        }
....

这是在SuccessScreen数据/模型(我将它们放在一起)文件中定义的。我从Android开发者的Rally应用程序中复制了它。

我知道这事很多,我很感激你的耐心。没有任何信息太小。

谢谢你提前帮忙。如果您需要任何信息,我非常乐意提供它,谢谢。

编辑;

添加运行错误;

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.think_healthy.keto, PID: 32069
    java.util.NoSuchElementException: Collection contains no element matching the predicate.
        at com.think_healthy.keto.model.SuccessInfoModel.getSuccessInfo(SuccessInfoModel.kt:120)
        at com.think_healthy.keto.ui.screens.success.SuccessInfoScreenKt.SuccessInfoDetails(SuccessInfoScreen.kt:39)
        at com.think_healthy.keto.ui.screens.success.SuccessInfoScreenKt.DisplaySuccessInfo(SuccessInfoScreen.kt:83)
        at com.think_healthy.keto.ui.screens.success.SuccessInfoScreenKt.SuccessInfoScreen(SuccessInfoScreen.kt:31)
        at com.think_healthy.keto.ComposableSingletons$KetoNavHostKt$lambda-3$1.invoke(KetoNavHost.kt:75)
        at com.think_healthy.keto.ComposableSingletons$KetoNavHostKt$lambda-3$1.invoke(KetoNavHost.kt:69)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:163)
        at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:162)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
        at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:60)
        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:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
        at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:162)
        at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:141)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:133)
        at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:128)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:142)
        at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:73)
        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:141)
        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:67)
        at com.think_healthy.keto.KetoNavHostKt.KetoNavHost(KetoNavHost.kt:22)
        at com.think_healthy.keto.ComposableSingletons$MainActivityKt$lambda-2$1$2.invoke(MainActivity.kt:54)
        at com.think_healthy.keto.ComposableSingletons$MainActivityKt$lambda-2$1$2.invoke(MainActivity.kt:53)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
        at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:127)
        at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:127)
E/AndroidRuntime:     at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:145)
        at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2367)
        at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2634)
        at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3250)
        at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3228)
        at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:336)
        at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1)
        at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3228)
        at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3193)
        at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:753)
        at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1008)
        at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:125)
        at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:533)
        at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:502)
        at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
        at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
        at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
        at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:919)
        at android.view.Choreographer.doCallbacks(Choreographer.java:729)
        at android.view.Choreographer.doFrame(Choreographer.java:661)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:907)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6549)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:451)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

从应用程序崩溃的那一刻起,我在LOGCAT上得到了这个错误;

代码语言:javascript
复制
2022-10-12 21:40:36.758 5964-5964/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.think_healthy.keto, PID: 5964
    java.util.NoSuchElementException: Collection contains no element matching the predicate.
        at com.think_healthy.keto.model.SuccessInfoModel.getSuccessInfo(SuccessInfoModel.kt:120)
        at com.think_healthy.keto.ui.screens.success.SuccessInfoScreenKt.SuccessInfoDetails(SuccessInfoScreen.kt:39)
        at com.think_healthy.keto.ui.screens.success.SuccessInfoScreenKt.DisplaySuccessInfo(SuccessInfoScreen.kt:83)
        at com.think_healthy.keto.ui.screens.success.SuccessInfoScreenKt.SuccessInfoScreen(SuccessInfoScreen.kt:31)
        at com.think_healthy.keto.ComposableSingletons$KetoNavHostKt$lambda-3$1.invoke(KetoNavHost.kt:75)
        at com.think_healthy.keto.ComposableSingletons$KetoNavHostKt$lambda-3$1.invoke(KetoNavHost.kt:69)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:163)
        at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:162)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
        at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:60)
        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:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
        at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:162)
        at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:141)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:133)
        at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:128)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:142)
        at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:73)
        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:141)
        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:67)
        at com.think_healthy.keto.KetoNavHostKt.KetoNavHost(KetoNavHost.kt:22)
        at com.think_healthy.keto.ComposableSingletons$MainActivityKt$lambda-2$1$2.invoke(MainActivity.kt:54)
        at com.think_healthy.keto.ComposableSingletons$MainActivityKt$lambda-2$1$2.invoke(MainActivity.kt:53)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
        at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:127)
        at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:127)
        at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:145)
EN

回答 1

Stack Overflow用户

发布于 2022-10-12 05:29:33

当应用程序停止时,您也可以上传错误报告吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74034195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档