Expanded vs Flexible в Flutter

В Flutter, и Expanded
, и Flexible
используются внутри таких виджетов компоновки, как Row
, Column
и Flex
, чтобы управлять пространством, занимаемым дочерними элементами. Они довольно похожи, но есть несколько отличий:
1. Виджет Expanded
:
Expanded
заставляет дочерний виджет занять все доступное пространство внутри родительского виджета (например,Row
илиColumn
), разделяя его пропорционально, если присутствуют другие виджетыExpanded
.- Не позволяет дочернему элементу самостоятельно уменьшаться или увеличиваться. Он обязан заполнить оставшееся пространство.
Пример использования:
Row(
children: [
Expanded(
child: Container(
color: Colors.red,
child: Text('Expanded widget'),
),
),
Expanded(
child: Container(
color: Colors.green,
child: Text('Another Expanded widget'),
),
),
],
)
В этом примере оба виджета Expanded
займут половину доступного горизонтального пространства, так как оно делится между ними поровну.
2. Виджет Flexible
:
-
Flexible
предоставляет больше контроля, чемExpanded
. Он позволяет дочернему виджету занять доступное пространство, но при этом может уменьшаться или увеличиваться в зависимости от ограничений родительского виджета. -
Flexible
может работать в двух режимах:Flexible(fit: FlexFit.loose)
иFlexible(fit: FlexFit.tight)
. -
FlexFit.tight
похож наExpanded
(заставляет дочерний элемент заполнить всё доступное пространство). -
FlexFit.loose
позволяет дочернему элементу занять столько места, сколько ему необходимо, но не заставляет его заполнять всё пространство.
Пример использования (с loose fit):
Row(
children: [
Flexible(
fit: FlexFit.loose,
child: Container(
color: Colors.blue,
width: 100, // Займёт только 100 пикселей по ширине, даже если доступно больше пространства.
child: Text('Flexible loose'),
),
),
Expanded(
child: Container(
color: Colors.orange,
child: Text('Expanded'),
),
),
],
)
В этом примере виджет Flexible
займёт только 100 пикселей, которые ему нужны, в то время как виджет Expanded
заполнит оставшееся доступное пространство.
Основные отличия:
Expanded
: Заставляет дочерний виджет заполнить всё доступное пространство.Flexible
: Позволяет дочернему виджету занять либо всё доступное пространство (tight
), либо только столько, сколько нужно (loose
).
Используйте Expanded
, когда хотите, чтобы виджет занимал всё доступное пространство, и используйте Flexible
, когда нужен более точный контроль над занимаемым пространством.