#flutter #user-interface #widget
#трепетание #пользовательский интерфейс #виджет
Вопрос:
Здравствуйте, у меня есть приведенный ниже код
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body:
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize.max,
children: [
// FlexibleWidget(),
ExpandedWidget(),
FlexibleWidget(),
],
),
Row(
children: [
ExpandedWidget(),
ExpandedWidget(),
],
),
Row(mainAxisSize: MainAxisSize.min,
children: [
FlexibleWidget(),
FlexibleWidget(),
],
),
Row(mainAxisSize: MainAxisSize.min,
children: [
FlexibleWidget(),
ExpandedWidget(),
],
),
],
),
);
}
}
class ExpandedWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.green,
border: Border.all(color: Colors.white),
),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Expanded',
style: TextStyle(color: Colors.white, fontSize: 24),
),
),
),
);
}
}
class FlexibleWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Flexible(
child: Container(
decoration: BoxDecoration(
color: Colors.red,
border: Border.all(color: Colors.white),
),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Flexible',
style: TextStyle(color: Colors.black, fontSize: 24),
),
),
),
);
}
}
И результат таков:
Разве первый контейнер не заполняет пространство, оставшееся после установки гибкого виджета? Поскольку он также принадлежит столбцу с дочерним элементом из 2 развернутых виджетов, размер ширины столбца должен составлять весь экран. Это означает, что строка тоже должна занимать весь экран. Я бы ожидал, что расширенный зеленый виджет в первой строке заполнит строку до тех пор, пока не останется белого, как на изображении ниже:
Вместо этого он заполняет только половину страницы. Кто-нибудь может объяснить это поведение?
Комментарии:
1. Выравнивание по осям: выравнивание по осям.растягивание,
2. Это выдает ошибку
Ответ №1:
Позвольте мне начать с FlexFit, прежде чем перейти к сути. FlexFit.tight
позволяет дочерним элементам заполнять остальное пространство, но FlexFit.loose
позволяет дочерним элементам изменять свои размеры по своему усмотрению.
Теперь, как вы, возможно, знаете Expanded
, это не что иное, как гибкий с плотно прилегающим т.е. fit: FlexFit.tight
.
Expanded(
child: child,
)
is equivalent to
Flexible(
fit: FlexFit.tight,
child: child,
)
Теперь давайте рассмотрим ваш пример.
Для первого блока есть два виджета с Flex 1 (по умолчанию), которые разделят экран на две половины; каждому будет предоставлено 50%. Это не означает, что они должны занимать 50% экрана. Это означает, что они могут расширяться до 50% экрана. Итак, Expanded
виджет делает это. Он занимает 50% экрана, поскольку он плотно прилегает.
Переходя к Flexible
виджету, по умолчанию он следует за свободным. Итак, он говорит своим дочерним элементам, что они могут расширяться до 50%, но нет никаких ограничений на то, что они должны занимать все пространство. Они могут занимать любое пространство, которое они хотят, но верхняя граница установлена на 50%. В вашем случае требуется только пространство для размещения «гибкого» текста с некоторым заполнением. Так что это нужно.
Комментарии:
1. Спасибо за ваш подробный ответ. Чего я не совсем понимаю, так это зачем делать виджеты, каждый из которых занимает 50% доступного пространства, изображение ниже взято из видеоролика flutter widget of the week, и в этом случае каждый виджет должен занимать 1/3 доступного пространства, но гибкий один клири расширяет свою собственную 1/3. В любом случае, как я могу заполнить всю строку целиком?
2. Это происходит из-за свойства Flex. Если в строке есть два виджета, каждый с flex : 1, это означает, что разделите доступное пространство между двумя виджетами. Здесь доступное пространство составляет 100%, что соответствует размеру экрана. Таким образом, эти виджеты получают половину размера экрана для каждого. Возможно, вам потребуется разобраться в основных функциях макета.. Ознакомьтесь с этой действительно замечательной статьей. Надеюсь, это решит ваши проблемы. medium.com/flutter-community /…
3. Спасибо, теперь я понимаю, что это потому, что ДВА из этих виджетов имеют коэффициент гибкости.