gpt4 book ai didi

android - Jetpack Compose 扩展 BottomSheetScaffold 的 BottomSheet 仅在重组后有效

转载 作者:行者123 更新时间:2023-12-04 23:57:33 24 4
gpt4 key购买 nike

我试图有一种方法在我的应用程序中的任何地方显示一个 BottomSheet,为此我使用 BottomSheetScaffold和一个 LiveData 对象,该对象保存当前可组合函数,该函数被观察为状态:

val sheetContent by MusicHub.state.bottomSheet.getContent().observeAsState()

BottomSheetScaffold(
modifier = Modifier
.fillMaxSize(),
scaffoldState = bottomSheetScaffoldState,
sheetPeekHeight = 0.dp,
sheetContent = sheetContent!!
)
我在我的应用程序中使用 BottomSheet 作为上下文菜单。例如,当我在我的应用程序中长按播放列表时,它会设置 BottomSheet 的内容并显示如下:
PlaylistItem(
// ...
onLongClick = {
// Set the LiveData composable
MusicHub.state.bottomSheet.setContent {
PlaylistContextMenuTest(playlist!!, viewModel)
}

// Expand BottomSheet
scope.launch {
MusicHub.state.bottomSheet.expand()
}
}
)
一般来说,这是可行的,但是当 BottomSheet 第一次展开时,它会显示片刻,然后再次消失在底部。这是一个小GIF:
enter image description here
我的猜测是,BottomSheet 的大小还没有重新计算,因此它只在下一次重新组合中起作用。来自网络开发,我会说它是 requestAnimationFrame 的典型案例,但我不太清楚如何在 compose 中解决这个问题。
编辑:
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)
}
}
}
}
)
}
完整的 ContextMenu 来源:( https://pastebin.com/sg4ed96L )

最佳答案

你似乎是对的。第一次似乎是重新计算 BottomSheet 的高度。
由于这在第二次尝试时不会改变,因此它将被显示。
是否 this answer帮你?
对于 BottomSheetScaffold,它似乎工作得很好,但对于 ModalBottomSheetLayout(我正在寻找的东西,正如您在链接答案的评论中看到的那样)。
编辑:Accompanist's Navigation Material也值得一看。

关于android - Jetpack Compose 扩展 BottomSheetScaffold 的 BottomSheet 仅在重组后有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67461354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com