Как я могу просто установить высоту AppBar во Flutter?
Заголовок панели должен оставаться по центру по вертикали (в этом AppBar).
Вы смотрели это? Вы также можете создать свой собственный виджет как AppBar и установить его высоту.
@Leviathlon моя плохая. проверьте мой ответ (надеюсь) на лучшую помощь
Если вы используете Visual Code, Ctrl + щелчок в функции AppBar.
Widget demoPage() {
AppBar appBar = AppBar(
title: Text('Demo'),
);
return Scaffold(
appBar: appBar,
body: /*
page body
*/,
);
}
И отредактируйте этот кусок.
app_bar.dart will open and you can find
preferredSize = new Size.fromHeight(kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0)),
Разница в росте!


Он не об этом просил. Он хочет, чтобы заголовок был по центру вертикально
centerTitle: true; можно использовать для этого.
вертикальный центр, а не горизонтальный
Таким образом, он не считывает новую высоту. Я не думаю, что было бы хорошей идеей переделывать исходный файл, например app_bar.dart, для его изменения.
Редактировать исходники фреймворка - очень плохая идея. Если вы обновите фреймворк, это приведет к поломке вашего приложения.
Дорогой друг, не хамить. Но вы должны удалить этот ответ. Это неправильно и может ввести в заблуждение других новичков.
На момент написания этой статьи я не знал о PreferredSize. Ответ Цинна лучше всего подходит для этого.
Вы можете создать свой собственный виджет с произвольной высотой:
import "package:flutter/material.dart";
class Page extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Column(children : <Widget>[new CustomAppBar("Custom App Bar"), new Container()],);
}
}
class CustomAppBar extends StatelessWidget {
final String title;
final double barHeight = 50.0; // change this for different heights
CustomAppBar(this.title);
@override
Widget build(BuildContext context) {
final double statusbarHeight = MediaQuery
.of(context)
.padding
.top;
return new Container(
padding: new EdgeInsets.only(top: statusbarHeight),
height: statusbarHeight + barHeight,
child: new Center(
child: new Text(
title,
style: new TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
),
),
);
}
}
Вы можете использовать PreferredSize:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Example',
home: Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(50.0), // here the desired height
child: AppBar(
// ...
)
),
body: // ...
)
);
}
}
Это увеличивает размер AppBar, но не центрирует текст.
Вы можете использовать свойство centerTitle, чтобы центрировать его.
@CopsOnRoad Это центрирует его по горизонтали, но не по вертикали.
@CopsOnRoad Я знаю, но я просто указывал на то, о чем просит OP.
Вы можете обернуть заголовок в контейнер и установить верхнее поле, чтобы центрировать его по вертикали.
Можно ли это установить на MaterialApp аналогично тому, как ThemeData можно установить на верхнем уровне? Я ищу способ избежать написания переопределений для каждого класса AppBar или пользовательского класса AppBar.
@ user482594 вы можете создать отдельный класс для панели приложений и использовать его везде, где захотите
@Giraldi Вы можете центрировать его, используя свойство flexibleSpace, проверьте этот ответ
Это не показывает ящик, если он у вас есть на эшафоте.
Для этого можно использовать PreferredSize и flexibleSpace:
appBar: PreferredSize(
preferredSize: Size.fromHeight(100.0),
child: AppBar(
automaticallyImplyLeading: false, // hides leading widget
flexibleSpace: SomeWidget(),
)
),
Таким образом, вы можете оставить elevation из AppBar, чтобы его тень оставалась видимой, и иметь нестандартную высоту, что я как раз и искал. Однако вам нужно установить интервал в SomeWidget.
Это должен быть принятый ответ! Большое спасибо.
В дополнение к ответу @Cinn вы можете определить такой класс
class MyAppBar extends AppBar with PreferredSizeWidget {
@override
get preferredSize => Size.fromHeight(50);
MyAppBar({Key key, Widget title}) : super(
key: key,
title: title,
// maybe other AppBar properties
);
}
или так
class MyAppBar extends PreferredSize {
MyAppBar({Key key, Widget title}) : super(
key: key,
preferredSize: Size.fromHeight(50),
child: AppBar(
title: title,
// maybe other AppBar properties
),
);
}
а затем использовать его вместо стандартного
Цинн ответ - это здорово, но с ним не так одна вещь.
Виджет PreferredSize запускается сразу в верхней части экрана, без учета строки состояния, поэтому часть его высоты будет затенена высотой строки состояния. Это также учитывает боковые выемки.
Решение: обернуть дочерний элемент preferredSize в SafeArea
appBar: PreferredSize(
//Here is the preferred height.
preferredSize: Size.fromHeight(50.0),
child: SafeArea(
child: AppBar(
flexibleSpace: ...
),
),
),
Если вы не хотите использовать свойство flexibleSpace, то в этом нет необходимости, потому что другие свойства AppBar автоматически учитывают строку состояния.
но SafeArea должен уменьшить высоту строки состояния, но вы добавили его снова с помощью MediaQuery.of(context).padding.top? Думаю, SafeArea здесь не нужен.
@Ryde SafeArea важен, так как панель приложения не перекрывается со строкой состояния, но на самом деле MediaQuery.of(context).padding.top не нужен. Ответ отредактировал, спасибо.
Вы можете использовать свойство toolbarHeight панели приложений, оно делает именно то, что вы хотите.
toolbarHeight:Больше нет необходимости использовать PreferredSize. Используйте toolbarHeight с flexibleSpace.
AppBar(
toolbarHeight: 120, // Set this height
flexibleSpace: Container(
color: Colors.orange,
child: Column(
children: [
Text('1'),
Text('2'),
Text('3'),
Text('4'),
],
),
),
)
Очень хорошее решение, спасибо копам
toolbarHeight в вашем AppBar.Пример :
AppBar(
title: Text('Flutter is great'),
toolbarHeight: 100,
),
You can add
flexibleSpaceproperty in your appBar for more flexibility
Выход:
Пример:
appBar: PreferredSize(
preferredSize: Size(100, 80), //width and height
// The size the AppBar would prefer if there were no other constraints.
child: SafeArea(
child: Container(
height: 100,
color: Colors.red,
child: Center(child: Text('Fluter is great')),
),
),
),
Don't forget to use a
SafeAreawidget if you don't have a safeArea
Выход :
Я уже предоставил решение toolBarHeight, второе: «Для большего количества элементов управления используйте предпочтительный размер» - не обязательно, toolbarHeight хорошо справляется со своей задачей.
просто вы можете использовать toolbarHeight
return MaterialApp(
home: Scaffold(
appBar: AppBar(
elevation: 0,
backgroundColor: white,
toolbarHeight: 70,
title: Align(
alignment: Alignment.centerRight,
child: Text(
'Complete Installments',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: black
),
),
)
),
),
);
@Mans Речь идет о «получении» высоты
AppBar, а не о ее «настройке».