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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.