小编Nim*_*mmi的帖子

撰写分页:ConstraintLayout 中 NavHost 中的 LazyColumn items 方法导致 IllegalStateException:检查失败

将 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)

android android-jetpack-compose jetpack-compose-navigation

6
推荐指数
0
解决办法
981
查看次数

Jetpack Compose 扩展 BottomSheetScaffold 的 BottomSheet 仅在重组后才起作用

我试图找到一种方法来从应用程序中的任何位置显示 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)

android bottom-sheet android-jetpack-compose

5
推荐指数
1
解决办法
1万
查看次数