这与官方公布的LookaheadScope人中的doc人略有不同.

这就是分支,main分支,它总是工作得很好,而develop分支,更改有限,会引发异常.

有限的变化主要是在布局上.

要突出显示以下内容:

在总是运转良好的主分支机构中,

if (isInColumn) {
    Column {
        item0()
        item1()
        item2()
        item3()
    }
} else {
    Row {
        item0()
        item1()
        item2()
        item3()
    }
}

布局略有不同: (这个 idea 只是为了try 引入更复杂的布局)

if (isInColumn) {
    Column {
        item0()
        item1()
        Row {
            item2()
            item3()
        }
    }
} else {
    Row {
        Column {
            item0()
            item1()
        }
        item2()
        item3()
    }
}

第一次点击总是有效的,然而,第二次点击总是崩溃.

抛出的完整异常:

FATAL EXCEPTION: main
Process: com.idiotleon.demo.demolookaheadapplication, PID: 24551
java.lang.IllegalStateException: Cannot insert LayoutNode@cc72396 children: 0 measurePolicy: androidx.compose.foundation.layout.BoxKt$EmptyBoxMeasurePolicy$1@5465a19 because it already has a parent. This tree: |-LayoutNode@5d08563 children: 1 measurePolicy: androidx.compose.foundation.layout.RowColumnImplKt$rowColumnMeasurePolicy$1@6be2ade
|-LayoutNode@01962b1 children: 0 measurePolicy: androidx.compose.foundation.layout.BoxKt$EmptyBoxMeasurePolicy$1@5465a19 Other tree: |-LayoutNode@68fe1f5 children: 1 measurePolicy: androidx.compose.foundation.layout.RowColumnImplKt$rowColumnMeasurePolicy$1@6be2ade
|-LayoutNode@cc72396 children: 0 measurePolicy: androidx.compose.foundation.layout.BoxKt$EmptyBoxMeasurePolicy$1@5465a19
at androidx.compose.ui.node.LayoutNode.insertAt$ui_release(LayoutNode.kt:246)
at androidx.compose.ui.node.UiApplier.insertBottomUp(UiApplier.android.kt:31)
at androidx.compose.ui.node.UiApplier.insertBottomUp(UiApplier.android.kt:21)
at androidx.compose.runtime.ComposerImpl$insertMovableContentGuarded$1$1$3.invoke(Composer.kt:3102)
at androidx.compose.runtime.ComposerImpl$insertMovableContentGuarded$1$1$3.invoke(Composer.kt:3097)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:810)
at androidx.compose.runtime.CompositionImpl.applyLateChanges(Composition.kt:852)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:607)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:510)
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:1410)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1420)
at android.view.Choreographer.doCallbacks(Choreographer.java:1047)
at android.view.ChoreographerExtImpl.checkScrollOptSceneEnable(ChoreographerExtImpl.java:442)
at android.view.Choreographer.doFrame(Choreographer.java:918)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1395)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:240)
at android.os.Looper.loop(Looper.java:351)
at android.app.ActivityThread.main(ActivityThread.java:8416)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@69eb7b6, androidx.compose.ui.platform.MotionDurationScaleImpl@a51dcb7, StandaloneCoroutine{Cancelling}@2a4ec24, AndroidUiDispatcher@803b38d]

这个例外是关于什么的?新布局 node 看起来一开始无法删除,因此无法插入.

请问如何调试和解决这个问题? 谢谢.

推荐答案

我不完全确定您在一行中定义子行的目的是什么,但问题来自这样一个事实:Compose不知道如何在子行布局和父行布局的其他子行(一个接一个)之间进行度量或平衡.

我在我的机器上测试了您的代码,类似这样的东西解决了崩溃问题.在这段代码中,有两个行子布局和组合可以自动解决它们之间的测量问题

else {
            Row {
                Row {
                    item0()
                    item1()
                }
                Row() {
                    item2()
                    item3()
                }
            }
        }

现在,如果你想知道为什么这不会导致类似的问题:

if (isInColumn) {
    Column {
        item0()
        item1()
        Row {
            item2()
            item3()
        }
    }
}

这是因为(列的)其他子布局是在另一个子布局之前定义的,所以Compose将首先计算它们的度量值,然后再计算子布局度量值,而不会出现问题

或者,这样的代码也可以修复您的代码

     else {
            Row() {
                    item0()
                    item1()
                Row() {
                    item2()
                    item3()
                }
            }
        }

我不是最好的解说员,但我希望这能说得通.

编辑1:大致相同的解决方案只需用一行将item2()和item3()包装起来,就不会有任何问题

if (isInColumn) {
            Column {
                item0()
                item1()
                Row {
                    item2()
                    item3()
                }
            }
        } else {
            Row() {
                Column{
                    item0()
                    item1()
                }

                Row() {
                    item2()
                    item3()
                }
            }
        }

Android相关问答推荐

无法列出目录中的文件'

Jetpack Compose中的导航找不到NavHost类的名称为:startDestination";的参数

图像在Android Studio中显示,但不在设备中显示

这款应用与最新版本的Android不兼容.在Android 14中

Jetpack Compose和Android Studio中的普通设计工具有什么不同?

为什么柱子的高度不都一样?

空数据来自改装

布局可组合项如何具有可测量和约束参数?

Jetpack Compose - 在屏幕外偏移绘制形状并使用非常大的尺寸

我的自定义小吃店不适合我的全宽屏幕尺寸

如何在 Jetpack Compose 中将文本绘制在另一个对象的中心?

Material 3 中的 ModalBottomSheet 用于 compose

在 react native 中设置 react-native-paper 组件的样式

在android studio中使用wifi配对设备的问题

优化 Room 数据库迁移

Android:为什么 ICICI iMobile Pay 应用程序在我的应用程序中显示root/jailbroken设备?

Android Studio Emulator Internet 连接问题仅是第一次

多个项目 react-native android 构建错误

如何满足设备内框架的无效 Wear OS 屏幕截图Wear OS 表盘策略违规?

如何使 BasicTextField 上的光标以 jetpack compose 为中心?