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

Nim*_*mmi 5 android bottom-sheet android-jetpack-compose

我试图找到一种方法来从应用程序中的任何位置显示 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 = Modifier
            .fillMaxWidth()
            .navigationBarsPadding()
            // TODO: Replace that with a percentage of the screen height
            .heightIn(max = 384.dp)
            .verticalScroll(scrollState),
        content = {
            ContextMenu {
                repeat(4){
                    addOption(R.drawable.ic_delete_black_24dp, "Delete"){
                        Timber.d("Delete Playlist")
                        viewModel.deletePlaylist(playlist)
                    }
                }
            }
        }
    )
}
Run Code Online (Sandbox Code Playgroud)

完整的 ContextMenu 来源:( https://pastebin.com/sg4ed96L )

Nim*_*mmi 0

新版本的 jetpack compose 已解决此问题。我不确定它是 beta 8 还是 beta 9,但现在一切都按预期运行。