Есть ли простой (не LayoutBuilder) способ размера элемента относительно размера экрана (ширина / высота)? Например: как мне установить ширину CardView равной 65% ширины экрана.
Это не может быть сделано внутри build
метода (очевидно), поэтому его придется отложить до пост-сборки. Есть ли предпочтительное место для такой логики?
Ответы:
FractionallySizedBox
также может быть полезным. Вы также можете прочитать ширину экрана непосредственноMediaQuery.of(context).size
и создать размерную коробку на основе этогоесли вы действительно хотите, чтобы размер как часть экрана независимо от того, что макет.
источник
Это дополнительный ответ, показывающий реализацию нескольких упомянутых решений.
FractionallySizedBox
Если у вас есть один виджет, вы можете использовать
FractionallySizedBox
виджет, чтобы указать процент доступного пространства для заполнения. Здесь зеленый цветContainer
заполнен на 70% доступной ширины и 30% доступной высоты.расширенный
Expanded
Виджет позволяет виджет , чтобы заполнить доступное пространство, в горизонтальном направлении, если он находится в ряде, или вертикально , если он находится в колонке. Вы можете использоватьflex
свойство с несколькими виджетами, чтобы придать им вес. Здесь зеленый цветContainer
занимает 70% ширины, а желтый -Container
30% ширины.Если вы хотите сделать это вертикально, просто замените
Row
наColumn
.Дополнительный код
Вот
main.dart
код для вашей справки.источник
Dialog
стайлингом :)Это может быть немного более понятно:
Надеюсь, что это решило вашу проблему.
источник
Вы можете построить столбец / строку с гибкими или расширенными дочерними элементами, у которых есть значения flex, которые складываются в требуемые проценты.
Вы также можете найти виджет AspectRatio полезным.
источник
источник
Есть много способов сделать это
1. Использование MediaQuery: полный экран вашего устройства, включая панель приложений и панель инструментов.
2. Используя Расширенное: Вы можете установить ширину / высоту в соотношении
3. Другие, такие как Flexible и AspectRatio и FractionallySizedBox
источник
вы можете использовать MediaQuery с текущим контекстом вашего виджета и получать ширину или высоту, как это
double width = MediaQuery.of(context).size.width double height = MediaQuery.of(context).size.height
после этого, вы можете умножить его на процент, который вы хотитеисточник
Сначала получите размер экрана.
После этого вы можете получить
width
и умножить его0.5
на 50% ширины экрана.Но проблема обычно возникает
height
, по умолчанию, когда мы используемВысота, которую мы получаем, является глобальной высотой, которая включает в себя
StatusBar
+notch
+AppBar
высоту. Итак, чтобы получить левую высоту устройства, нам нужно вычестьpadding
высоту (StatusBar
+notch
) иAppBar
высоту из общей высоты. Вот как мы это делаем.Теперь мы можем использовать следующее, чтобы получить 50% высоты экрана.
источник
если вы используете GridView, вы можете использовать что-то вроде решения Яна Хиксона.
источник
Используйте виджет LayoutBuilder, который даст вам ограничения, которые вы можете использовать для получения высоты, исключающей AppBar и отступы. Затем используйте SizedBox и укажите ширину и высоту, используя ограничения из LayoutBuilder.
источник