Как я могу создавать новые модификаторы, которые зависят от значений некоторых других модификаторов? Скажем, в качестве примера я хочу сделать высоту дочерних компонентов равной половине той, которая передается от родительского элемента, плюс некоторая константа (таким образом, я не могу использовать fillMaxHeight (фракция: Float)).

@Composable
fun View() {
   MyComposable(modifier = Modifier.size(40.dp))
}

@Composable
fun MyComposable(
  modifier: Modifier          // Assuming this modifier contains a size
) {
  Box(modifier) {             // Setting the the size from the passed in modifier
    val childHeightModifier = Modifier.height(???) // <-- Wanted to be some specific value depending on parent size
    
    Box(childHeightModifier) {
       ...
    }
  }
}
0
Johan Paul 23 Сен 2021 в 09:20

2 ответа

Лучший ответ

Вы можете использовать BoxWithConstraints для этого конкретного варианта использования, он предоставляет ограничения, налагаемые родителем на его дочерние элементы:

@Composable
fun View() {
   MyComposable(modifier = Modifier.size(40.dp))
}

@Composable
fun MyComposable(modifier: Modifier) {
  BoxWithConstraints(modifier) { // this: BoxWithConstraintsScope
    val childHeightModifier = Modifier.height(maxHeight * 0.5f)
    Box(childHeightModifier) {
       ...
    }
  }
}

Что касается связи между Modifier s, существует система ModifierLocal в разработке, что позволит сделать именно это.

2
Evolitist 23 Сен 2021 в 07:48

Обычно это невозможно сделать, вы можете передать это значение в качестве аргумента.

Но в этом конкретном случае вы можете установить размер представления в зависимости от родителя, используя:

  1. .fillMaxHeight(fraction = 0.5f), где дробь является частью родительского представления, например эквивалент .height(heightDp * 0.5f)
  2. .padding(left = 10.dp) (или right) для описания размера статическим значением.

Изменение порядка fillMaxHeight и padding также даст вам другой эффект (.height(heightDp * 0.5f - 10.dp) против (heightDp - 10.dp) * 0.5f), узнайте больше о порядке модификаторов в этот ответ

0
Philip Dukhov 23 Сен 2021 в 07:53