问题出现在多个屏幕上。令我惊讶的是,相同的代码适用于以前版本的应用程序。我只是更新了合成库,然后所有这些都在多个位置上一次又一次地发生。
我正在使用LazyColumn填充列表项。每当我试图滚动它,应用程序崩溃。下面是我使用的抽象代码。将撰写BOM版本更新为 2023-08-00 后出现问题。同样的代码适用于其他屏幕。这里唯一的区别是懒惰列项几乎是屏幕高度的一半(1:1宽高比)。所以每个屏幕上通常有两个项目。
val users = viewModel.usersList
val lazyColumnListState = rememberLazyListState()
val shouldStartPaginate = remember {
derivedStateOf {
viewModel.canPaginate && (lazyColumnListState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
?: -9) >= (lazyColumnListState.layoutInfo.totalItemsCount - 9)
}
}
LaunchedEffect(key1 = shouldStartPaginate.value) {
if (shouldStartPaginate.value && viewModel.listState == ListState.IDLE)
viewModel.getMoreUsers()
}
//Inside Scafold
LazyColumn(
state = lazyColumnListState,
verticalArrangement = Arrangement.spacedBy(12.dp),
modifier = Modifier.padding(top = 16.dp)
) {
items(
items = users,
key = { it.userID ?: (1000..5000).random() }) { i ->
ComposeExploreItem(i)
}
if (users.isNotEmpty()) {
item {
Spacer(modifier = Modifier.height(40.dp))
}
}
composeLazyColumnPagingLoader(
viewModel.listState,
users,
"No users available"
)
}
这是Crash Log。
java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1517)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:471)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:39)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:352)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:908)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:228)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1156)
at android.view.View.draw(View.java:23269)
at android.view.View.updateDisplayListIfDirty(View.java:22133)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:832)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7918)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
3条答案
按热度按时间5jvtdoz21#
虽然我的解决方案与
LazyColumn
的情况无关,但由于一些已经绘制的可组合对象被重新绘制,因此会发生错误。在我的情况下,它发生了,因为我使用的
HorizontalPager
在XML布局ViewPager
与非常复杂的屏幕内-所以调试成为地狱。它可以通过将
beyondBoundsPageCount
与一个值添加到HorizontalPager
来克服,因为默认值是0
!我不确定这是Google Compose团队的问题还是我做错了什么,但我确信修复并不像更新库那样简单(至少对我来说,我尝试了多次升级和降级,以及多个可能的库)fivyi3re2#
虽然我仍然不知道问题的根源,但我已经找到了避免崩溃的方法,将可滚动布局 Package 到
ConstraintLayout
中例如
ConstraintLayout(modifier = Modifier.fillMaxSize()) { LazyColumn(Modifier.constraintAs(...) {...}) {...} }
希望有帮助。
0dxa2lsx3#
我的
LazyColumn
也有同样的问题,这是相当复杂的Collapsingaperture实现的一部分。但似乎这个问题只在debugbuild中重现。最有可能的是,它与一些额外的编写调试计算有关,这些计算会减慢整个应用程序的速度。在我的发布版本中,我无法重现此问题,而在调试版本中,每次都会重现此问题。