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 )
| 归档时间: |
|
| 查看次数: |
10641 次 |
| 最近记录: |