отрегулируйте высоту содержимого с помощью нижнего листа в эшафоте нижних листов

Я хочу динамически изменять высоту содержимого относительно нижнего листа в нижнем листе следующим образом:

Это то, что я пробовал до сих пор: `

      
val bottomSheetState = rememberBottomSheetState(initialValue =BottomSheetValue.Expanded )

val bottomSheetScaffoldState= rememberBottomSheetScaffoldState(
        bottomSheetState = bottomSheetState)

val heightPixels= LocalContext.current.resources.displayMetrics.heightPixels

BottomSheetScaffold(
modifier = Modifier.fillMaxSize()
sheetPeekHeight = 68.dp,
scaffoldState = bottomSheetScaffoldState,
sheetContent = {
    /*
    sheet content
     */
}) {
    Box(modifier = Modifier
        .fillMaxWidth()
        .fillMaxHeight(((bottomSheetState.offset.value)
                / (heightPixels)).let { if (it == 0f) 1f else it })
    ) {
        /*
        content
         */
    }
}

Но это зависит от высоты системы в пикселях, и поле с его содержимым перестраивается каждый раз, когда изменяется высота нижнего листа.

1 ответ

мне удалось это настроитьModifier.fillMaxHeight()использоватьfractionзначение состояния каркаса, как показано ниже:

      val bottomSheetState = rememberBottomSheetState(
    initialValue = BottomSheetValue.Expanded
)

val bottomSheetScaffoldState = rememberBottomSheetScaffoldState(
    bottomSheetState = bottomSheetState
)

BottomSheetScaffold(
    modifier = Modifier.fillMaxSize(),
    sheetPeekHeight = 68.dp,
    scaffoldState = bottomSheetScaffoldState,
    sheetContent = {
        /*
        sheet content
         */
    }) {
    val fraction = 1f - bottomSheetScaffoldState.currentFraction
    Box(
        modifier = Modifier
            .padding(bottom = 68.dp)
            .fillMaxHeight(fraction)
    ) {
        /*
        content
         */
    }
}

currentFractionэто небольшая корректировка его значения, потому что ход анимации перетаскивания всегда идет от 0 до 1, независимо от того, идет ли он от к или отExpandedкCollapsedсостояние:

      @OptIn(ExperimentalMaterialApi::class)
val BottomSheetScaffoldState.currentFraction: Float
get() {
    val fraction = bottomSheetState.progress.fraction
    val targetValue = bottomSheetState.targetValue
    val currentValue = bottomSheetState.currentValue

    return when {
        currentValue == BottomSheetValue.Collapsed && targetValue == BottomSheetValue.Collapsed -> 0f
        currentValue == BottomSheetValue.Expanded && targetValue == BottomSheetValue.Expanded -> 1f
        currentValue == BottomSheetValue.Collapsed && targetValue == BottomSheetValue.Expanded -> fraction
        else -> 1f - fraction
    }
}

Проблема в том, что это вызывает какое-то мерцание при расширении или сворачивании листа, что не идеально.

Другие вопросы по тегам