Как установить коэффициент половинного расширения для нижнего листа в Compose?

В XML у нас есть нижний лист material3. Это позволяет нам установить поведение нижнего листа. Его можно обновить так:

      bottomSheetBehavior.halfExpandedRatio = 0.6
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED

Я переношу проект в Compose. Мое приложение использовало это полурасширенное соотношение для 3-позиционного нижнего листа: свернуто, наполовину расширено, расширено. Теперь я пытаюсь создать нижний лист следующим образом:

      val sheetState = rememberBottomSheetState(
        initialValue = BottomSheetValue.Collapsed
    )
    val scaffoldState = rememberBottomSheetScaffoldState(
        bottomSheetState = sheetState
    )
BottomSheetScaffold(
        scaffoldState = scaffoldState,
        sheetContent = {}
) {}

Но похоже, что у нас нет этих атрибутов поведения здесь. Можем ли мы получить то же поведение, что и в XML, с раскрытым наполовину нижним листом?

1 ответ

Да, это возможно. Но это немного работы. Вы в основном должны предоставить свои собственные реализации классов иSwipeableStateа также любые связанные перечисления, классы и составные функции, используемые этими двумя.

Основные моменты, на которые стоит обратить внимание:

  • предоставить третье значение дляBottomSheetValueдля полураскрытого состояния
  • предоставить функцию, которая анимирует полурасширение (аналогично функциямexpand()иcollapse()вBottomSheetState), а также свойство, которое проверяет, развернут ли нижний лист наполовину (аналогичноval isExpanded: Boolean)
  • добавить третийswipeable anchorс половинным значением расширения, которого вы хотите достичь (отметьте строкуfullHeight - peekHeightPx to Collapsed, здесь вы хотите добавить свой собственный якорь)
  • обрабатывать полурасширенное состояние в.semanticsблокModifierвBottomSheetScaffold

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