Android Studio java.lang.IllegalStateException:replace()对未放置的项目调用

pxy2qtax  于 2023-10-23  发布在  Android
关注(0)|答案(3)|浏览(215)

问题出现在多个屏幕上。令我惊讶的是,相同的代码适用于以前版本的应用程序。我只是更新了合成库,然后所有这些都在多个位置上一次又一次地发生。
我正在使用LazyColumn填充列表项。每当我试图滚动它,应用程序崩溃。下面是我使用的抽象代码。将撰写BOM版本更新为 2023-08-00 后出现问题。同样的代码适用于其他屏幕。这里唯一的区别是懒惰列项几乎是屏幕高度的一半(1:1宽高比)。所以每个屏幕上通常有两个项目。

  1. val users = viewModel.usersList
  2. val lazyColumnListState = rememberLazyListState()
  3. val shouldStartPaginate = remember {
  4. derivedStateOf {
  5. viewModel.canPaginate && (lazyColumnListState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
  6. ?: -9) >= (lazyColumnListState.layoutInfo.totalItemsCount - 9)
  7. }
  8. }
  9. LaunchedEffect(key1 = shouldStartPaginate.value) {
  10. if (shouldStartPaginate.value && viewModel.listState == ListState.IDLE)
  11. viewModel.getMoreUsers()
  12. }
  13. //Inside Scafold
  14. LazyColumn(
  15. state = lazyColumnListState,
  16. verticalArrangement = Arrangement.spacedBy(12.dp),
  17. modifier = Modifier.padding(top = 16.dp)
  18. ) {
  19. items(
  20. items = users,
  21. key = { it.userID ?: (1000..5000).random() }) { i ->
  22. ComposeExploreItem(i)
  23. }
  24. if (users.isNotEmpty()) {
  25. item {
  26. Spacer(modifier = Modifier.height(40.dp))
  27. }
  28. }
  29. composeLazyColumnPagingLoader(
  30. viewModel.listState,
  31. users,
  32. "No users available"
  33. )
  34. }

这是Crash Log。

  1. java.lang.IllegalStateException: replace() called on item that was not placed
  2. at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1517)
  3. at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
  4. at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:471)
  5. at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:39)
  6. at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:352)
  7. at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:908)
  8. at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:228)
  9. at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1156)
  10. at android.view.View.draw(View.java:23269)
  11. at android.view.View.updateDisplayListIfDirty(View.java:22133)
  12. at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
  13. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
  14. at android.view.View.updateDisplayListIfDirty(View.java:22089)
  15. at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
  16. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
  17. at android.view.View.updateDisplayListIfDirty(View.java:22089)
  18. at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
  19. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
  20. at android.view.View.updateDisplayListIfDirty(View.java:22089)
  21. at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
  22. at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
  23. at android.view.View.updateDisplayListIfDirty(View.java:22089)
  24. at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
  25. at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
  26. at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
  27. at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
  28. at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
  29. at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
  30. at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
  31. at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
  32. at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
  33. at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
  34. at android.view.Choreographer.doCallbacks(Choreographer.java:899)
  35. at android.view.Choreographer.doFrame(Choreographer.java:832)
  36. at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
  37. at android.os.Handler.handleCallback(Handler.java:942)
  38. at android.os.Handler.dispatchMessage(Handler.java:99)
  39. at android.os.Looper.loopOnce(Looper.java:201)
  40. at android.os.Looper.loop(Looper.java:288)
  41. at android.app.ActivityThread.main(ActivityThread.java:7918)
  42. at java.lang.reflect.Method.invoke(Native Method)
  43. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
  44. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
5jvtdoz2

5jvtdoz21#

虽然我的解决方案与LazyColumn的情况无关,但由于一些已经绘制的可组合对象被重新绘制,因此会发生错误。
在我的情况下,它发生了,因为我使用的HorizontalPager在XML布局ViewPager与非常复杂的屏幕内-所以调试成为地狱。
它可以通过将beyondBoundsPageCount与一个值添加到HorizontalPager来克服,因为默认值是0!我不确定这是Google Compose团队的问题还是我做错了什么,但我确信修复并不像更新库那样简单(至少对我来说,我尝试了多次升级和降级,以及多个可能的库)

fivyi3re

fivyi3re2#

虽然我仍然不知道问题的根源,但我已经找到了避免崩溃的方法,将可滚动布局 Package 到ConstraintLayout
例如ConstraintLayout(modifier = Modifier.fillMaxSize()) { LazyColumn(Modifier.constraintAs(...) {...}) {...} }
希望有帮助。

0dxa2lsx

0dxa2lsx3#

我的LazyColumn也有同样的问题,这是相当复杂的Collapsingaperture实现的一部分。但似乎这个问题只在debugbuild中重现。最有可能的是,它与一些额外的编写调试计算有关,这些计算会减慢整个应用程序的速度。在我的发布版本中,我无法重现此问题,而在调试版本中,每次都会重现此问题。

相关问题