Флаттерные растянутые столбцы на всю высоту экрана

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

Я пытался добавить Row ко всему, но выдает ошибку RenderFlex children have non-zero flex but incoming width constraints are unbounded? Поэтому я попытался обернуть это Row в виджет Expanded, который выдает ошибку «Расширенные виджеты должны быть помещены внутрь виджетов Flex».

return Scaffold(
  backgroundColor: Color(0xFF222222),
  body: Column(
  children: <Widget>[
    SizedBox(height: 20),
    Row(
      // crossAxisAlignment: CrossAxisAlignment.stretch,//throws error
      children: <Widget>[
        Expanded(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              Container(
                color: Colors.red,
                child: Text('Left', textAlign: TextAlign.center),
              ),
            ],
          ),
        ),
        Expanded(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              Container(
                color: Colors.red,
                child: Text('Right', textAlign: TextAlign.center),
              ),
            ],
          ),
        ),
      ],
    ),
    Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Container(
          color: Colors.red,
          child: Text('Bottom', textAlign: TextAlign.center),
        ),
      ],
    ),
  ],
),
);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
0
75 900
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

окончательная редакция версии 4:

это должно работать со столбцами

     return Scaffold(
      backgroundColor: Color(0xFF222222),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          SizedBox(height: 20),
          Expanded(
            child: Row(
              mainAxisSize: MainAxisSize.max,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      Expanded(
                        child: Container(
                          color: Colors.red,
                          child: Text('Left', textAlign: TextAlign.center),
                        ),
                      ),
                    ],
                  ),
                ),
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      Expanded(
                        child: Container(
                          color: Colors.red,
                          child: Text('Right', textAlign: TextAlign.center),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
           Expanded(
            child: Column(
              mainAxisSize: MainAxisSize.max,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                Expanded(
                  child: Container(
                    color: Colors.green,
                    child: Text('Bottom', textAlign: TextAlign.center),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );

Вы используете звонки, чтобы получить высоту? Конечно, это не способ сделать это, он должен просто растягиваться, чтобы заполнить экран, как это делается с шириной в столбцах, используя crossAxisAlignment: CrossAxisAlignment.stretch. Я уверен, что ему вообще не нужны никакие параметры height.

Hasen 25.07.2019 15:58

Хорошо, теперь это выглядит лучше, я думал, что вы везде используете MediaQuery. Но ты превратил Columns в containers? Они должны быть Columns.

Hasen 25.07.2019 16:09

забавная вещь.. если вы завернете свой внешний столбец в контейнер, вам вообще не нужно называть высоту..

Markus Hein 25.07.2019 16:10

Вы имеете в виду завернутые в контейнеры, завернутые в расширенные?

Hasen 25.07.2019 16:13

Да я тоже пока мучаюсь. Флаттер — это кошмар для такого рода вещей. Если бы это работало как CSS, лол.

Hasen 25.07.2019 16:18

Это немного работает, но нижний контейнер не имеет высоты. Вот как это для вас? Это должно выглядеть как на изображении, прикрепленном в другом ответе. Если вы измените цвета каждой коробки, будет легче понять, что я имею в виду.

Hasen 25.07.2019 16:25

Давайте продолжить обсуждение в чате.

Markus Hein 25.07.2019 16:34

Вы уверены, что все скобки правильные? У меня почему-то не получается это скопировать.

Hasen 25.07.2019 16:34

Вот способ равномерного распределения ваших контейнеров (как по горизонтали, так и по вертикали):

return Scaffold(
  backgroundColor: Color(0xFF222222),
  body: Column(
    mainAxisAlignment: MainAxisAlignment.spaceBetween,
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: <Widget>[
      Expanded(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Expanded(
              child: Container(
                color: Colors.red,
                child: Text('Left', textAlign: TextAlign.center),
              ),
            ),
            Expanded(
              child: Container(
                color: Colors.green,
                child: Text('Right', textAlign: TextAlign.center),
              ),
            ),
          ],
        ),
      ),
      Expanded(
        child: Container(
          color: Colors.blue,
          child: Text('Bottom', textAlign: TextAlign.center),
        ),
      ),
    ],
  ),
);

Результат:

Выглядит хорошо, но текст в контейнерах должен быть в столбцах, как в моем исходном коде. Таким образом, каждая коробка может содержать несколько элементов.

Hasen 25.07.2019 16:12

Это правильно, просто нужна небольшая настройка. Вместо текстового виджета, являющегося дочерним элементом контейнера, дочерним элементом является столбец. Вам просто нужно добавить следующие параметры в столбец mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,

F-1 25.07.2019 20:17

Кроме того, вы можете использовать ListView вместо столбца, чтобы избежать предупреждений о переполнении содержимого.

F-1 26.07.2019 10:00
Ответ принят как подходящий

Это больше похоже на то, что вам нужно?

Каждый контейнер содержит столбец, позволяющий добавлять несколько виджетов.

return Scaffold(
      backgroundColor: Color(0xFF222222),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Expanded(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Expanded(
                    child: Container(
                      color: Colors.red,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.start,
                        children: <Widget>[
                          Text('Left', textAlign: TextAlign.center),
                          Text('Left', textAlign: TextAlign.center),
                          Text('Left', textAlign: TextAlign.center),
                        ],
                      ),
                    ),
                  ),
                  Expanded(
                    child: Container(
                      color: Colors.green,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: <Widget>[
                          Text('Right', textAlign: TextAlign.center),
                          Text('Right', textAlign: TextAlign.center),
                          Text('Right', textAlign: TextAlign.center),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
            Expanded(
              child: Container(
                color: Colors.blue,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('Bottom', textAlign: TextAlign.center),
                    Text('Bottom', textAlign: TextAlign.center),
                    Text('Bottom', textAlign: TextAlign.center),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );

Screenshot of code running

О да, это выглядит хорошо. Я проверю это и вернусь к вам.

Hasen 26.07.2019 21:39

Чтобы заставить столбцы занимать всю ширину экрана и равномерно распределять высоту, я сделал следующее:

return MaterialApp(
  home: Scaffold(
    backgroundColor: Colors.black,
    body: SafeArea(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            child: SizedBox(
              width: double.infinity,
              child: FlatButton(
                onPressed: () {
                  playSound(1);
                },
                color: Colors.blue,
              ),
            ),
          ),

Виджет Расширенный будет иметь общую высоту, в то время как виджет Размерная коробка займет всю ширину, а для ширины установлено значение double.infinity.

Это может не дать прямого ответа на ваш вопрос

Column, по умолчанию растягивается до полной высоты (это можно изменить с помощью size: MainAxisSize.min), так что, возможно, вы говорите о растяжении дочерних элементов. Для этого вы должны использовать Expanded.

Column(
  children: <Widget>[
    ChildWidget1(),
    Expanded( // <-- Use Expanded with SizedBox.expand
      child: SizedBox.expand(
        child: ChildWidget2(),
      ),
    ),
  ],
)

Другие вопросы по теме