Flutter: требуется объяснение, почему expanded() исправляет исключение, вызванное виджетом row (), как дочерним элементом виджета с ограниченным столбцом () Виджет

#flutter #layout

#flutter #макет

Вопрос:

У меня возникла проблема с внедрением виджета Row() в качестве дочернего элемента виджета Parent Column(), который был ограничен виджетом ConstrainedBox(maxHeight: 150).

В этом сценарии я получаю исключение «BoxConstraints forces бесконечная высота«. исключение.

Вот упрощенный код (я включаю метод build () только для краткости):

   @override
  Widget build(BuildContext context) {
    return ConstrainedBox(
      constraints: BoxConstraints(maxHeight: 150),
      child: Column(
        mainAxisSize: MainAxisSize.max,
        children: [
          Container(
            color: Colors.yellow,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                Text("Hello"),
                Text("There"),
              ],
            ),
          ),
        ],
      ),
    );
  }
 

Я прочитал предыдущее сообщение, предлагающее использовать Expanded () для решения исключения, поэтому я обернул виджет Container () выше с помощью Expanded (), и это сработало, но мой вопрос в ТОМ, ПОЧЕМУ?

У меня создалось впечатление, что expanded() просто заставляет связанный с ним дочерний виджет занимать все доступное пространство его родителя. Но получает ли он также свой дочерний виджет для распознавания ограничений от своего родителя?

Еще одним интересным аспектом этого сценария является то, что если я оберну Row() с помощью Expanded() вместо Container() , это не сработает, и будет выдано исключение. По какой-либо причине это должен быть Container() .

Вся помощь с благодарностью. Мне нравится Flutter, но я все еще борюсь с подробностями его алгоритма компоновки.

/ Joselito

Ответ №1:

Это связано с тем, что строки и столбцы будут продолжать расширяться на основе их дочерних элементов, для Row:- он будет продолжать расширяться по горизонтали, и вы обычно увидите, что он переполняется справа от экрана.

Для столбца: — он будет продолжать расширяться по вертикали и обычно переполняет нижнюю часть.

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

https://flutter.dev/docs/development/ui/layout

Ответ №2:

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

Комментарии:

1. Спасибо, @losif Pop за статью, но я уже прочитал ее, и их использование BoxConstraints() и expanded() соответствует документации. Сценарий, упомянутый выше, кажется другим, хотя в том, что expanded(), похоже, заставляет базовую строку () соответствовать ограничениям от своего родителя. Но я снова просмотрел статью и получил одно хорошее предложение: выполнить трассировку по коду Flutter. Я просто набираюсь смелости, чтобы сделать это, поскольку боюсь получить больше путаницы, чем ясности.