Определение размера контейнера до половины размера экрана во флаттере
Я пытаюсь получить контейнер равным половине высоты экрана [после рассмотрения высоты AppBar] и половине ширины экрана.
Это то, что я придумал...
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Flexible(
child: Container(
width: MediaQuery.of(context).size.width / 2,
color: Colors.red,
),
),
Flexible(
flex: 1,
child: Container(),
)
],
),
);
}
}
5 ответов
Вы можете вычесть AppBar
высота для настройки Container
размер.
@override
Widget build(BuildContext context) {
var appBar = AppBar();
return Scaffold(
appBar: appBar,
body: Align(
alignment: Alignment.topCenter,
child: Container(
height: (MediaQuery.of(context).size.height - appBar.preferredSize.height) / 2,
width: MediaQuery.of(context).size.width / 2,
color: Colors.red,
),
),
);
}
ht tps://stackru.com/images/37361326eb9e2f6d96d691c6eff235556f135c3b.jpg
Если вы хотите, чтобы высота контейнера составляла половину доступного пространства, вы можете использовать виджет LayoutBuilder. С помощью виджета LayoutBuilder вы можете узнать в функции построителя, какой будет максимальная доступная ширина и высота. Пример использования в вашем случае будет выглядеть так:
Scaffold(
appBar: AppBar(),
body: Align(
alignment: Alignment.topCenter,
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Container(
height: constraints.maxHeight / 2,
width: MediaQuery.of(context).size.width / 2,
color: Colors.red,
);
},
),
),
);
Лучший способ и самый простой способ решить эту и подобные проблемы - просто использовать
FractionallySizedBox
виджет; например
FractionallySizedBox(
alignment: Alignment.topCenter,
widthFactor: 0.5,
child: Container(
height: 100,
),
),
Этот виджет (FractionallySizedBox
) позволяет вам наращивать
child
указав долю родительской ширины (или высоты), доступную для
child
виджет. После этого, указав
alignment
, вы можете указать способ распределения остального пространства.
Для получения дополнительной помощи по этому виджету посетите официальную страницу справки этого виджета.
Вы на правильном пути в использовании MediaQuery, но ваш код может быть намного проще:
Scaffold(
appBar: AppBar(),
body: Align(
alignment: Alignment.topCenter,
child: Container(
height: MediaQuery.of(context).size.height / 2,
width: MediaQuery.of(context).size.width / 2,
color: Colors.red,
),
),
);
Или просто просто...
SizedBox(
height: MediaQuery.of(context).size.height*0.5,
child: ...,
),