Flutter: установка высоты панели приложений

Как я могу просто установить высоту AppBar во Flutter?

Заголовок панели должен оставаться по центру по вертикали (в этом AppBar).

@Mans Речь идет о «получении» высоты AppBar, а не о ее «настройке».

Buğra Ekuklu 28.06.2018 21:57

Вы смотрели это? Вы также можете создать свой собственный виджет как AppBar и установить его высоту.

Bostrot 28.06.2018 23:26

@Leviathlon моя плохая. проверьте мой ответ (надеюсь) на лучшую помощь

Mans 29.06.2018 17:15
128
3
121 736
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Если вы используете 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)),

Разница в росте!

sample image

sample image

Он не об этом просил. Он хочет, чтобы заголовок был по центру вертикально

Rémi Rousselet 28.06.2018 23:43

centerTitle: true; можно использовать для этого.

goops17 29.06.2018 15:39

вертикальный центр, а не горизонтальный

Rémi Rousselet 29.06.2018 15:44

Таким образом, он не считывает новую высоту. Я не думаю, что было бы хорошей идеей переделывать исходный файл, например app_bar.dart, для его изменения.

goops17 29.06.2018 15:49

Редактировать исходники фреймворка - очень плохая идея. Если вы обновите фреймворк, это приведет к поломке вашего приложения.

Konstantin 16.10.2019 05:02

Дорогой друг, не хамить. Но вы должны удалить этот ответ. Это неправильно и может ввести в заблуждение других новичков.

Anoop.P.A 24.04.2021 10:48

На момент написания этой статьи я не знал о 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, но не центрирует текст.

Duncan Jones 22.09.2018 09:29

Вы можете использовать свойство centerTitle, чтобы центрировать его.

CopsOnRoad 30.09.2018 11:39

@CopsOnRoad Это центрирует его по горизонтали, но не по вертикали.

Giraldi 11.04.2019 09:10

@CopsOnRoad Я знаю, но я просто указывал на то, о чем просит OP.

Giraldi 26.07.2019 16:15

Вы можете обернуть заголовок в контейнер и установить верхнее поле, чтобы центрировать его по вертикали.

Edwin Liu 14.12.2019 09:29

Можно ли это установить на MaterialApp аналогично тому, как ThemeData можно установить на верхнем уровне? Я ищу способ избежать написания переопределений для каждого класса AppBar или пользовательского класса AppBar.

user482594 07.05.2020 10:40

@ user482594 вы можете создать отдельный класс для панели приложений и использовать его везде, где захотите

Mohamed Kamel 27.07.2020 21:49

@Giraldi Вы можете центрировать его, используя свойство flexibleSpace, проверьте этот ответ

CopsOnRoad 18.01.2021 18:27

Это не показывает ящик, если он у вас есть на эшафоте.

John Wang 22.06.2021 09:49

Для этого можно использовать PreferredSize и flexibleSpace:

appBar: PreferredSize(
  preferredSize: Size.fromHeight(100.0),
  child: AppBar(
    automaticallyImplyLeading: false, // hides leading widget
    flexibleSpace: SomeWidget(),
  )
),

Таким образом, вы можете оставить elevation из AppBar, чтобы его тень оставалась видимой, и иметь нестандартную высоту, что я как раз и искал. Однако вам нужно установить интервал в SomeWidget.

Это должен быть принятый ответ! Большое спасибо.

Hazaaa 18.03.2020 12:30

В дополнение к ответу @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 05.07.2020 01:11

@Ryde SafeArea важен, так как панель приложения не перекрывается со строкой состояния, но на самом деле MediaQuery.of(context).padding.top не нужен. Ответ отредактировал, спасибо.

Tayan 05.07.2020 23:38

Вы можете использовать свойство 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'),
      ],
    ),
  ),
)

Очень хорошее решение, спасибо копам

Reiko Dev 11.06.2021 15:57

Самый простой способ - использовать свойство toolbarHeight в вашем AppBar.

Пример :

AppBar(
   title: Text('Flutter is great'),
   toolbarHeight: 100,
  ),

You can add flexibleSpace property 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 SafeArea widget if you don't have a safeArea

Выход :

Я уже предоставил решение toolBarHeight, второе: «Для большего количества элементов управления используйте предпочтительный размер» - не обязательно, toolbarHeight хорошо справляется со своей задачей.

CopsOnRoad 01.06.2021 07:54

просто вы можете использовать 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
            ),
          ),
        )

    ),
  ),
);

результат

Другие вопросы по теме