Что такое виджет Container в Flutter и для чего он используется?

«Что такое виджет Container в Flutter и для чего он используется?» — вопрос из категории Flutter виджеты, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Container — это универсальный виджет-контейнер в Flutter, который объединяет в себе возможности управления layout, отступами, оформлением и трансформациями. По сути, это удобная обёртка, комбинирующая несколько базовых виджетов (Padding, Align, DecoratedBox, ConstrainedBox и др.).

Ключевые свойства и их применение:

  • child: Единственный дочерний виджет.
  • padding (внутренний отступ) и margin (внешний отступ): Принимают EdgeInsets.
    Container(
      margin: EdgeInsets.all(12.0), // Отступ снаружи
      padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), // Отступ внутри
      child: Text('Content'),
    )
  • decoration: Определяет фон, границы, тени, градиенты. Использует BoxDecoration. Важно: Если задаёте decoration, цвет фона нужно указывать внутри него (color свойство Container будет проигнорировано).
    Container(
      decoration: BoxDecoration(
        color: Colors.blue[100], // Фон
        borderRadius: BorderRadius.circular(12.0),
        border: Border.all(color: Colors.blue, width: 2.0),
        boxShadow: [
          BoxShadow(color: Colors.grey, blurRadius: 4.0, offset: Offset(2, 2)),
        ],
      ),
      child: ...
    )
  • constraints: Ограничения на размер (минимальная/максимальная ширина/высота) через BoxConstraints.
  • width и height: Прямое задание размеров. Если не заданы, Container «схлопывается» вокруг своего child с учётом padding.
  • alignment: Выравнивание дочернего виджета внутри контейнера (Alignment.center, Alignment.topRight и т.д.).
  • transform: Применяет матричную трансформацию (например, поворот, масштабирование) к контейнеру.

Практическое правило: Container — это ваш «швейцарский нож» для быстрой стилизации и позиционирования одиночных виджетов. Для сложных раскладок из нескольких детей используйте Row, Column или Stack.