使用Jetpack Compose ModalBottomSheet报错:偏移量未初始化
Jetpack Compose ModalBottomSheet状态提升后点击报错问题
我正在使用Jetpack Compose的ModalBottomSheet,并将状态通过State hoisting提升至其祖先组件,具体实现代码如下:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Demo4Theme { // A surface container using the 'background' color from the theme Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { ArticleScreen() } } } } } @Stable class ArticleState( val orderModalState: SageSheetState, val filterModalState: DrawerState ) @OptIn(ExperimentalMaterial3Api::class) @Composable fun rememberSageSheetState( state: SageSheetState = SageSheetState( coroutineScope = rememberCoroutineScope(), sheetState = rememberSheetState() )): SageSheetState { return remember { state } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun rememberArticleState( orderModalState: SageSheetState = rememberSageSheetState(), filterModalState: DrawerState = rememberDrawerState(DrawerValue.Closed) ): ArticleState { return remember { ArticleState( orderModalState = orderModalState, filterModalState = filterModalState ) } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun ArticleScreen( state: ArticleState = rememberArticleState() ) { Column { Text("${state.orderModalState.sheetState.currentValue}") Text("${state.orderModalState.sheetState.isVisible}") Text("${state.orderModalState.sheetState.targetValue}") Button(onClick = { state.orderModalState.showModal() }) { Text("Show Modal") } } Modal( modalState = state.orderModalState, ) } @OptIn(ExperimentalMaterial3Api::class) class SageSheetState( private val coroutineScope: CoroutineScope, val sheetState: SheetState, openBottomSheet: Boolean = false ) { var openBottomSheet by mutableStateOf(openBottomSheet) fun showModal() { coroutineScope.launch { openBottomSheet = true sheetState.collapse() } } fun closeModal() { coroutineScope.launch { sheetState.hide() openBottomSheet = false } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun Modal( modalState: SageSheetState ) { // Sheet content if (modalState.openBottomSheet) { ModalBottomSheet( onDismissRequest = { modalState.closeModal() }, sheetState = modalState.sheetState, ) { Text("Hello") } } }
但点击Show Modal按钮时出现报错:
The offset was read before being initialized. Did you access the offset in a phase before layout, like effects or composition?
我不清楚问题出在哪里,怀疑是State hoisting的使用方式有误,而将状态保存在组件内部的官方示例可正常运行。
注意事项
- 使用的是最新版Compose Material3:
androidx.compose.material3:material3:1.1.0-alpha06 - 运行项目可能需要修改仓库配置。
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

