Compose BottomSheetScaffold IndexOutOfBoundsException 应用程序崩溃

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

我搜索了与此问题相关的解决方案,但一无所获。我解决了问题,所以我在这里发布问题和解决方案,目的是帮助某人。

问题描述

将 Jetpack Compose 从版本

1.2.0-beta02
更新到
1.2.0-rc02
后,屏幕上的某些内容导致应用程序崩溃。

此特定屏幕上的代码在版本之间没有更改,因此崩溃必须是由我正在使用的 Compose 组件之一引起的。我通过反复试验的方法设法找到了崩溃的根源,发现问题出在

BottomSheetScaffold
组件(带有空,有点,
content
)。

导致崩溃的代码:

BottomSheetScaffold(
        sheetContent = { Text(text = "Some sheet content") }
    ) {
        AlertDialog(
            onDismissRequest = {
                // NO-OP
            },
            buttons = {
                Text(text = "here goes a button")
            }
        )
    }

崩溃日志:

2022-07-01 10:02:07.185 16257-16257/my.example.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: my.example.app, PID: 16257
    java.lang.IndexOutOfBoundsException: Index 0 is out of bounds. The list has 0 elements.
        at androidx.compose.runtime.collection.MutableVectorKt.checkIndex(MutableVector.kt:1135)
        at androidx.compose.runtime.collection.MutableVectorKt.access$checkIndex(MutableVector.kt:1)
        at androidx.compose.runtime.collection.MutableVector$MutableVectorList.get(MutableVector.kt:940)
        at androidx.compose.material.BottomSheetScaffoldKt$BottomSheetScaffoldLayout$1$1.invoke-0kLqBqw(BottomSheetScaffold.kt:447)
        at androidx.compose.material.BottomSheetScaffoldKt$BottomSheetScaffoldLayout$1$1.invoke(BottomSheetScaffold.kt:430)
        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:590)
        at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:44)
        at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1428)
        at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1427)
        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2101)
        at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:110)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:78)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:66)
        at androidx.compose.ui.node.LayoutNode.performMeasure-BRTryo0$ui_release(LayoutNode.kt:1427)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:94)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.kt:75)
        at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.kt:1366)
        at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1.measure-3p2s80s(Box.kt:115)
        at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:44)
        at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:405)
        at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:53)
        at androidx.compose.foundation.layout.FillModifier.measure-3p2s80s(Size.kt:658)
        at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:53)
        at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1428)
        at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1427)
        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2101)
        at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:110)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:78)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:66)
        at androidx.compose.ui.node.LayoutNode.performMeasure-BRTryo0$ui_release(LayoutNode.kt:1427)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:94)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.kt:75)
        at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.kt:1366)
        at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1.measure-3p2s80s(Box.kt:115)
        at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:44)
        at androidx.compose.ui.graphics.BlockGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:342)
        at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:53)
        at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1428)
        at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1427)
        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2101)
android android-jetpack-compose indexoutofboundsexception android-bottomsheetdialog
1个回答
4
投票

BottomSheetScaffold
content
仅包含导致崩溃的
AlertDialog
组件(我猜它被视为空的
content
并且空的
content
将导致崩溃)。

AlertDialog
组件包裹在
Box
组件中后,崩溃消失了。我想
content
参数中至少必须有一些屏幕内容(
AlertDialog
可能不会被视为屏幕内容,因为它被提升了 - 我不确定)。

修复崩溃的代码:

BottomSheetScaffold(
        sheetContent = { Text(text = "Some sheet content") }
    ) {
        Box {
            AlertDialog(
                onDismissRequest = {
                    // NO-OP
                },
                buttons = {
                    Text(text = "here goes a button")
                }
            )
        }
    }

参考找到崩溃原因的 Google 问题跟踪器:https://issuetracker.google.com/issues/235588730

© www.soinside.com 2019 - 2024. All rights reserved.