You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:33:11