В Android match_parent
и wrap_content
используются для изменения размера виджетов автоматически относительно их родителей к содержанию виджет содержит.
Во Flutter кажется, что по умолчанию для всех виджетов установлено значение wrap_content
, как мне изменить его так, чтобы я мог заполнить его width
и height
его родительский?
Ссылка на оригинальную статью
источник
crossAxisAlignment
поле для строк и столбцов, которое можно настроить дляCrossAxisAlignment.stretch
горизонтального расширения, например, внутри столбцаКороткий ответ заключается в том, что родитель не имеет размера, пока его не получит ребенок.
Макет работает во Flutter так: каждый виджет предоставляет ограничения для каждого из своих дочерних элементов, например «вы можете быть до этой ширины, вы должны быть такими высокими, вы должны быть как минимум такими же» или что-то еще (в частности, они получить минимальную ширину, максимальную ширину, минимальную высоту и максимальную высоту). Каждый дочерний элемент принимает эти ограничения, что-то делает и выбирает размер (ширину и высоту), который соответствует этим ограничениям. Затем, когда каждый дочерний элемент сделает свое дело, виджет может выбрать свой размер.
Некоторые виджеты стараются быть настолько большими, насколько позволяет родитель. Некоторые виджеты стараются быть настолько маленькими, насколько позволяет родитель. Некоторые виджеты пытаются соответствовать определенному «естественному» размеру (например, тексту, изображениям).
Некоторые виджеты сообщают своим детям, что они могут быть любого размера. Некоторые накладывают на своих детей те же ограничения, что и их родители.
источник
PageView
внутри aColumn
, а другойColumn
внутри текущегоpage
, я получаю ошибку рендеринга, но я могу исправить ее,PageView
заключив внутрь aExpanded
или aFlexible
. Проблема в том, что эти 2 варианта только расширяют своего ребенка. Почему нет соответствующего виджета, который можно было бы сжать, например "обернуть содержимое", для решения такого рода проблем рендеринга?На самом деле доступны несколько вариантов:
Вы можете использовать SizedBox.expand, чтобы ваш виджет соответствовал родительским размерам, или SizedBox (width: double.infinity), чтобы соответствовать только ширине, или SizedBox (heigth: double.infinity), чтобы соответствовать только высоте.
Если вам нужно поведение wrap_content, оно зависит от родительского виджета, который вы используете, например, если вы поместите кнопку в столбец, он будет вести себя как wrap_content, а чтобы использовать его как match_parent, вы можете обернуть кнопку расширенным виджетом или размером.
С помощью ListView кнопка получает поведение match_parent, а чтобы получить поведение wrap_content, вы можете обернуть ее с помощью виджета Flex, такого как Row.
Использование расширенного виджета заставляет дочерний элемент строки, столбца или гибкого элемента расширяться, чтобы заполнить доступное пространство на главной оси (например, по горизонтали для строки или по вертикали для столбца). https://docs.flutter.io/flutter/widgets/Expanded-class.html
Использование гибкого виджета дает дочернему элементу строки, столбца или гибкости возможность расширяться, чтобы заполнить доступное пространство на главной оси (например, по горизонтали для строки или по вертикали для столбца), но, в отличие от расширенного, гибкий не требовать, чтобы ребенок заполнил доступное пространство. https://docs.flutter.io/flutter/widgets/F flexible-class.html
источник
Простой обходной путь:
Если контейнер имеет только один дочерний элемент верхнего уровня, вы можете указать свойство выравнивания для дочернего элемента и присвоить ему любое доступное значение. он заполнит все пространство в контейнере.
По-другому:
источник
BoxConstraints.expand(height: 100.0)
отлично работает какwidth="match_parent"
эквивалент AndroidЯ использовал это решение, вам нужно определить высоту и ширину экрана с помощью MediaQuery:
источник
источник
Используйте виджет
Wrap
.Для
Column
подобного поведения попробуйте:Для
Row
подобного поведения попробуйте:Для получения дополнительной информации: Wrap (виджет Flutter)
источник
Используйте эту строку кодов внутри столбца. Для wrap_content:
mainAxisSize: MainAxisSize.min
Для match_parent:mainAxisSize: MainAxisSize.max
источник
На самом деле есть очень простой и изящный способ сделать это.
Используйте
FractionallySizedBox
виджет.Этот виджет также очень полезен, если вы хотите, чтобы размер вашего дочернего элемента был долей размера его родителя.
источник
Чтобы дочерний элемент заполнил своего родителя, просто оберните его в FittedBox.
источник