Android Compose崩溃异常:需先调用layoutWithConstraints
解决Compose中"You must call layoutWithConstraints first"崩溃问题
这个崩溃的核心原因是:Compose文本组件的MultiParagraphLayoutCache在绘制阶段尝试获取文本布局结果时,发现布局约束还未被计算(即layoutWithConstraints方法未执行),从而抛出IllegalStateException。通常出现在自定义文本Modifier、或错误地在绘制阶段直接访问文本布局信息的场景。
解决方案:
不要在绘制回调中直接获取文本布局结果
如果你在自定义Modifier的draw操作里调用了getTextLayoutResult(),请将布局相关逻辑移到layoutModifier中执行,确保布局流程先于绘制完成。检查自定义文本组件的生命周期
若封装了自定义Text组件,确认没有在DrawScope等绘制阶段提前访问依赖布局的数据。Compose的布局(layout)流程必须在绘制(draw)之前完成,保证layoutWithConstraints被正确调用。升级Compose版本
部分旧版Compose存在布局与绘制时序的已知bug,升级到1.4.0及以上的稳定版可修复这类问题。
崩溃日志:
Fatal Exception: java.lang.IllegalStateException You must call layoutWithConstraints first androidx.compose.foundation.text.modifiers.MultiParagraphLayoutCache.getTextLayoutResult (MultiParagraphLayoutCache.kt:118) androidx.compose.foundation.text.modifiers.TextAnnotatedStringNode.draw (TextAnnotatedStringNode.kt:489) androidx.compose.ui.node.LayoutNodeDrawScope.drawDirect-x_KDEd0$ui_release (LayoutNodeDrawScope.kt:105) androidx.compose.ui.node.LayoutNodeDrawScope.draw-x_KDEd0$ui_release (LayoutNodeDrawScope.kt:86) androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers (NodeCoordinator.kt:365) androidx.compose.ui.node.NodeCoordinator.draw (NodeCoordinator.kt:354) androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw (LayoutModifierNodeCoordinator.kt:182) androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers (NodeCoordinator.kt:362) androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers (NodeCoordinator.kt:54) androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke (NodeCoordinator.kt:384) androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke (NodeCoordinator.kt:383) androidx.compose.runtime.snapshots.Snapshot$Companion.observe (Snapshot.kt:2303) androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe (SnapshotStateObserver.kt:473) androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads (SnapshotStateObserver.kt:230) androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release (OwnerSnapshotObserver.kt:133) androidx.compose.ui.node.NodeCoordinator.invoke (NodeCoordinator.kt:383) androidx.compose.ui.node.NodeCoordinator.invoke (NodeCoordinator.kt:54) androidx.compose.ui.platform.RenderNodeApi29.record (RenderNodeApi29.android.kt:209) androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList (RenderNodeLayer.android.kt:304) androidx.compose.ui.platform.AndroidComposeView.dispatchDraw (AndroidComposeView.android.kt:1167) android.view.View.draw (View.java:22957) android.view.View.updateDisplayListIfDirty (View.java:21789) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4606) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4579) android.view.View.updateDisplayListIfDirty (View.java:21740) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4606) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4579) android.view.View.updateDisplayListIfDirty (View.java:21740) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4606) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4579) android.view.View.updateDisplayListIfDirty (View.java:21740) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4606) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4579) android.view.View.updateDisplayListIfDirty (View.java:21740) android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:561) android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:567) android.view.ThreadedRenderer.draw (ThreadedRenderer.java:673) android.view.ViewRootImpl.draw (ViewRootImpl.java:4905) android.view.ViewRootImpl.performDraw (ViewRootImpl.java:4620) android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:3749) android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:2428) android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:9437) android.view.Choreographer$CallbackRecord.run (Choreographer.java:1228) android.view.Choreographer.doCallbacks (Choreographer.java:1012) android.view.Choreographer.doFrame (Choreographer.java:922) android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1213) android.os.Handler.handleCallback (Handler.java:938) android.os.Handler.dispatchMessage (Handler.java:99) android.os.Looper.loopOnce (Looper.java:233) android.os.Looper.loop (Looper.java:334) android.app.ActivityThread.main (ActivityThread.java:8513) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:582) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1068)
内容的提问来源于stack exchange,提问作者eldartsa
相关产品推荐
相关产品推荐

