Flutter: расширенный vs гибкий

97

Я использовал как Expandedи Flexibleвиджеты , и они , кажется, работают одинаково. Есть ли разница между двумя, которые я пропустил?


источник

Ответы:

116
Scaffold(
  appBar: AppBar(),
  body: Column(
    children: <Widget>[
      Row(
        children: <Widget>[
          buildExpanded(),
          buildFlexible(),
        ],
      ),
      Row(
        children: <Widget>[
          buildExpanded(),
          buildExpanded(),
        ],
      ),
      Row(
        children: <Widget>[
          buildFlexible(),
          buildFlexible(),
        ],
      ),
    ],
  ),
);

введите описание изображения здесь

Рауф Рахиш
источник
5
Гибкий занимает только необходимое пространство, а Расширенный занимает все доступное пространство с учетом flexфактора. Дополнительную информацию см. В документации по Expandedвиджету .
Александар
99

Expanded это просто сокращение для Flexible

Использование расширено таким образом:

Expanded(
  child: Foo(),
);

строго эквивалентно:

Flexible(
  fit: FlexFit.tight,
  child: Foo(),
);

Вы можете использовать Flexibleover, Expandedесли вам нужен другой fit, полезный в некоторых адаптивных макетах.

Разница между FlexFit.tightи FlexFit.looseзаключается в том, что свободная форма позволяет ее дочернему элементу иметь максимальный размер, в то время как жесткое ограничение заставляет его заполнить все доступное пространство.

Реми Русселе
источник
1
не Maximum sizeи Available spaceозначает то же самое здесь?
CopsOnRoad
Нет, под максимальным размером я имел в виду что-то вроде наличия в качестве дочернего элемента Flexible ConstrainedBox с maxHeight внутри столбца
Реми Русселе
25
Проще говоря, Flexible.tightзаставит детей занять все доступное пространство и Flexible.looseпозволит детям делать то, что они хотят. Некоторые дети могут занимать все пространство, а некоторые нет, в зависимости от их типа.
CopsOnRoad 08
30

Виджет в разделе « Гибкие» по умолчанию имеет значение WRAP_CONTENT, хотя его можно изменить с помощью параметра «Подогнать».

Виджет в разделе Expanded - MATCH_PARENT, вы можете изменить его с помощью flex .

Парвеш Хан
источник
1
Отличное объяснение для разработчиков Android!
SwiftiSwift
18

Expanded- Flexibleс комплектом

class Expanded extends Flexible {
    const Expanded({
        Key key,
        int flex = 1,
        @required Widget child,
    }) : super(
        key: key, 
        flex: flex, 
        fit: FlexFit.tight, 
        child: child
    );
}
Андрей Турковский
источник
16

Вы можете использовать « Гибкий», чтобы изменять размер виджетов в строках и столбцах . В основном он используется для настройки пространства различных дочерних виджетов, сохраняя связь с их родительскими виджетами.

Тем временем Expanded изменяет ограничения, отправляемые дочерним элементам строк и столбцов ; это помогает заполнить там доступные места. Поэтому, когда вы помещаете своего ребенка в расширенный виджет, он заполняет пустые места.

Предоставление этих видео с официального канала Flutter на YouTube только для того, чтобы помочь людям, которые могут поискать это в ближайшем будущем ...

  1. Расширенный:

  2. Гибкость:

одна секунда
источник
0

Expanded () - это не что иное, как Flexible () с

Flexible (fit: FlexFit.tight) = Expanded()

но fit :FlexFit.looseпо умолчанию используется гибкий .

FlexFit.tight = Хочет плотно прилегать к родителю, занимая как можно больше места.

FlexFit.loose = Хочет свободно вписаться в родительский элемент, занимая как можно меньше места для себя.

Яш
источник
0

Единственное отличие, если вы используете Flexibleвместо Expanded, заключается в том, что Flexibleего дочерний элемент имеет такую ​​же или меньшую ширину, чем он Flexibleсам, в то время как Expandedзаставляет его дочерний элемент иметь точно такую ​​же ширину, что и Expanded. Но оба Expandedи Flexibleигнорируют ширину своих детей при определении размеров.

Row(children:[
  Flexible(
    child: Container(color: Colors.red, child: Text('This is a very long text that won’t fit the line.'))),
  Flexible(
    child: Container(color: Colors.green, child: Text(‘Goodbye!’))),
  ]
)

введите описание изображения здесь

Примечание : это означает, что невозможно расширить Rowдетей пропорционально их размерам. Строка либо использует точную ширину дочернего элемента, либо полностью игнорирует ее, когда вы используете Expandedили Flexible.

Пареш Мангукия
источник