В программе Jetpack Compose есть макеты, содержащие Модификаторы макета под капотом, объясняющий порядок модификаторов, см. раздел Порядок действий.
порядок имеет значение при связывании модификаторов, поскольку они применяются к составному объекту, который они изменяют от более раннего к более позднему, что означает, что измерение и расположение модификаторов слева повлияют на модификатор справа. Окончательный размер составного объекта зависит от всех модификаторов, переданных в качестве параметра. Сначала модификаторы обновят ограничения слева направо, а затем вернут размер справа налево.
Чтобы лучше понять это, я бы рекомендовал выяснить, как макеты работают в Compose. Короче говоря, padding () - это LayoutModifer, он принимает некоторые ограничения, измеряет его размер дочернего элемента основан на проекции этих ограничений и помещает ребенка в некоторые координаты.
Давайте посмотрим на пример:
Box(
modifier = Modifier
.border(1.dp, Color.Red)
.size(32.dp)
.padding(8.dp)
.border(1.dp, Color.Blue)
)
И результат:
Но давайте поменяем местами .size()
и .padding()
Box(
modifier = Modifier
.border(1.dp, Color.Red)
.padding(8.dp)
.size(32.dp)
.border(1.dp, Color.Blue)
)
Теперь у нас другой результат:
Надеюсь, этот пример поможет вам понять, как применяются модификаторы.
Можно ожидать, что красная граница должна быть ближе всего к коробке, так как она была добавлена первой, поэтому порядок может показаться обратным, но у такого порядка тоже есть свои плюсы. Давайте посмотрим на этот составной элемент:
@Composable
fun MyFancyButton(modifier: Modifier = Modifier) {
Text(
text = "Ok",
modifier = modifier
.clickable(onClick = { /*do something*/ })
.background(Color.Blue, RoundedCornerShape(4.dp))
.padding(8.dp)
)
}
Просто переместив modifier
в аргументы, составной объект позволяет его родителям добавлять дополнительные модификаторы, такие как дополнительное поле. Поскольку модификаторы, добавленные последними, находятся ближе всего к кнопке, граница и внутреннее заполнение не пострадают.
person
Valeriy Katkov
schedule
13.01.2021