Мне было интересно, почему нужно использовать [Expanded] / [Flexible]
flex вместо [Align]
выравнивания? Вы можете точно выровнять свой виджет с помощью [Выровнять] и даже потенциально избежать [Padding]
.
Давайте посмотрим на это с другой точки зрения. Является ли использование гибкости [Expanded] / [Flexible]
более эффективным и быстрым, чем [Align]
?
Не уверен, что вы имеете в виду. Expanded
предназначен для (более или менее) «выбора», какой виджет внутри Row
/Column
должен заполнить оставшееся пространство. В то время как Align
просто позиционирует дочерний элемент внутри себя по заданному выравниванию.
Это сбивает с толку... можете ли вы показать пример кода? не уверен, что вы имеете в виду под «это не влияет».. наличие Expanded
внутри Row
/Column
всегда должно иметь эффект
Я имею в виду, что я не могу использовать виджет «Выравнивание» отдельно в виджете «Столбец», потому что ничего не происходит, пока я не оберну вокруг него виджет «Расширенный». Любая причина для этого?
конечно, да .. если у вас есть Column
с crossAxisAlignment
= CrossAxisAlignment.stretch
и у вас есть Align(child: Text('blubb')) он будет горизонтально центрировать ваш текстовый виджет 'blubb'.
Очевидно, что вы не можете Align
разместить свой виджет вертикально в Column
, потому что Align
не будет доступно больше места, чем размер его дочернего виджета.. для этого предназначен Expanded
. расти, чтобы заполнить доступное пространство.
к вашему сведению, из документации Align
: «Если размер не ограничен, а соответствующий коэффициент размера равен нулю, тогда виджет будет соответствовать размеру своего дочернего элемента в этом измерении» - Column
не имеет ограничений по вертикали, поэтому Align
будет соответствовать размеру дочернего элемента.
Это хорошо работает с одним Expanded, но если я использую его на всех Aligns, возникают ошибки. Как я могу ограничить столбец максимальным доступным размером, а затем использовать в нем выравнивание?
Я дал вам правильный ответ, потому что вы разъяснили его для меня.
Извините, я действительно не понимаю, чего вы хотите добиться. Может быть, попробуйте описать, как вы хотите, чтобы ваши виджеты были расположены, а не пытаться объяснить «баги» в рамках того, как, по вашему мнению, они должны себя вести.
Я предлагаю использовать несколько выравниваний в столбце, я спрашиваю вас, как мне это удалось сделать?
Почему вы хотите использовать несколько виджетов Align
внутри Column
? Вы уже знаете, «как» это сделать.. просто поместите их в список widgets
.. Я предполагаю, что это не приведет к макету, который вы себе представляете.. но я понятия не имею, какой макет вы хотите получить.. (как в моем предыдущий пример, если у вас есть Column(crossAxisAlignment = CrossAxisAlignment.stretch) с двумя Align(alignment=..centerRight, child=Text('asdf')), Align(alignment=centerRight, child=Text('asdf')) ... оба текстовых поля будут выровнены по правому краю... т. е. оба Align
работают внутри одного Column
Спасибо за комментарий, я намерен выровнять их по вертикали, потому что отступы не учитываются моей границей оформления ввода. В итоге я использовал Spacer() между виджетами вместо Padding.
Нет никакого сравнения между Expanded/Flex
и Align
. Взгляните на следующий фрагмент.
Column(
children: [
Container(color: Colors.blue, height: 200),
Align(child: Container(color: Colors.green)), // doesn't show anything
Expanded(child: Container(color: Colors.orange)), // shows up in the remaining space
],
);
Наличие Align
в качестве родителя Container
ничего не покажет на экране, но если вы используете Expanded/Flex
, оно займет левое пространство.
@TheUniqueProgrammer Да, тогда это покажет, я просто хотел показать разницу между этими двумя виджетами, заданную OP, на примере.
Ну, это не показывает разницу, поскольку @TheUniqueProgrammer показал, что это то же самое, когда используется Expanded + Align.
Например, я должен использовать Expanded + Align, если я хочу что-то выровнять, иначе это не влияет на это. Интересно, это лучше, чем Expanded (flex) + Padding?