Флаттер: встановлення висоти AppBar


111

Як я можу просто встановити висоту AppBarв Flutter?

Заголовок стовпчика повинен залишатися по центру вертикально (в цьому AppBar).


@Mans Це стосується "отримання" висоти AppBar, а не "встановлення".
Buğra Ekuklu

1
Ти подивився на це ? Ви також можете створити власний віджет як AppBar і встановити його висоту.
Бострот,

@Leviathlon мій поганий. перевірте мою відповідь на (сподіваюся) кращу допомогу
Ман

Відповіді:


210

Ви можете використовувати 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: // ...
      )
    );
  }
}

5
Це збільшує розмір AppBar, але не центрує текст.
Duncan Jones

5
Ви можете використовувати centerTitleмайно для його центрування.
CopsOnRoad

11
@CopsOnRoad Відцентрує його горизонтально, але не центрує вертикально.
Джиральді

1
@Giraldi Ви насправді не можете цього зробити, не змінивши вихідний файл або не створивши свій власнийAppBar
CopsOnRoad,

1
@CopsOnRoad Я знаю, але я просто вказував, про що просить ОП.
Джиральді

46

Ви можете використовувати PreferredSizeі flexibleSpaceдля нього:

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

Таким чином , ви можете тримати elevationв AppBarдля підтримки його тінь видно і мати власний ріст, який є те , що я просто шукав. SomeWidgetОднак вам потрібно встановити інтервал .


Це повинна бути прийнята відповідь! Дуже дякую.
Hazaaa,

14

На момент написання цього матеріалу я цього не знав 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),
        ),
      ),
    );
  }
}

10

На додаток до відповіді @ 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
    ),
  );
}

а потім використовувати його замість стандартного


4

Відповідь Цінна чудова, але в цьому одна проблема.

PreferredSizeВіджет буде негайно почати у верхній частині екрану, без урахування рядка стану, так що деякі з його висоти будуть затьмарені висотою рядка стану. Це також пояснює бічні вирізи.

Рішення : оберніть preferredSizeдитину дитини символомSafeArea

appBar: PreferredSize(
  //Here is the preferred height.
  preferredSize: Size.fromHeight(50.0),
  child: SafeArea(
    child: AppBar(
      flexibleSpace: ...
    ),
  ),
),

Якщо ви не хочете використовувати властивість flexіSpace, тоді немає необхідності у всьому цьому, оскільки інші властивості AppBarволі автоматично враховують рядок стану.


але SafeAreaце зменшити висоту рядка стану, але ви знову додали його за допомогою MediaQuery.of(context).padding.top? Я думаю, що SafeArea тут не потрібна.
Ryde

@Ryde The SafeAreaважливо, щоб рядок програми не збігався з рядком стану, але MediaQuery.of(context).padding.topнасправді це не потрібно. Я відредагував відповідь, дякую.
TN888,

1

Ви можете використовувати властивість toolbarHeight Appbar, вона робить саме те, що ви хочете.


1

Використання 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'),
      ],
    ),
  ),
)

-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)),

Різниця у зрості!

зразок зображення

зразок зображення


1
Це не те, про що він просив. Він хоче, щоб заголовок був вертикально відцентрований
Ремі Русселет,

centerTitle: правда; можна використовувати для цього.
goops17

вертикальний центр, а не горизонталь
Ремі Русселет,

Тому він не читає нової висоти. Я не думаю, що хороша ідея - це зміна вихідного файлу, наприклад app_bar.dart, для його зміни.
goops17

6
Дуже погана ідея коли-небудь редагувати джерела фреймворку. Якщо ви оновите фреймворк, ваш додаток зламається.
Костянтин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.