将 compose 升级到以下版本后,我遇到了一个奇怪的错误1.0.0-beta08:
java.lang.IllegalStateException: Check failed.
at androidx.compose.ui.node.OuterMeasurablePlaceable.getLastConstraints-msEJaDk(OuterMeasurablePlaceable.kt:36)
at androidx.compose.ui.node.LayoutNode.remeasure-BRTryo0$ui_release$default(LayoutNode.kt:1202)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.kt:171)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.kt:38)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:207)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:501)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:650)
at android.view.View.draw(View.java:22353)
at android.view.View.updateDisplayListIfDirty(View.java:21226)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:565)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:642)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4106)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3833)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3104)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1948)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8177)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223) …Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法来从应用程序中的任何位置显示 BottomSheet,因为我使用 和BottomSheetScaffold一个 LiveData 对象来保存当前可组合函数,该函数被观察为状态:
val sheetContent by MusicHub.state.bottomSheet.getContent().observeAsState()
BottomSheetScaffold(
modifier = Modifier
.fillMaxSize(),
scaffoldState = bottomSheetScaffoldState,
sheetPeekHeight = 0.dp,
sheetContent = sheetContent!!
)
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序中使用 BottomSheet 作为上下文菜单。例如,当我长按应用程序中的播放列表时,它会设置 BottomSheet 的内容并显示如下:
PlaylistItem(
// ...
onLongClick = {
// Set the LiveData composable
MusicHub.state.bottomSheet.setContent {
PlaylistContextMenuTest(playlist!!, viewModel)
}
// Expand BottomSheet
scope.launch {
MusicHub.state.bottomSheet.expand()
}
}
)
Run Code Online (Sandbox Code Playgroud)
一般来说,这是可行的,但第一次展开 BottomSheet 时,它会显示一瞬间,然后再次消失在底部。这是一个小 GIF:
我的猜测是,不知何故,BottomSheet 的大小尚未重新计算,因此它仅在下一次重组中起作用。来自网络开发人员,我会说这是 requestAnimationFrame 的典型案例,但我不太知道如何在撰写中解决这个问题。
编辑:
PlaylistContextMenu测试代码:
@Composable
fun PlaylistContextMenuTest(playlist: Playlist, viewModel: LibraryViewModel = activityViewModel()){
val scrollState = rememberScrollState()
Column(
modifier …Run Code Online (Sandbox Code Playgroud)