Flutter:设置AppBar的高度


110

如何简单地设置AppBarFlutter中的高度?

条形标题应保持居中垂直(在该位置AppBar)。


@Mans是关于“获取”高度,而AppBar不是“设定”高度。
BuğraEkuklu

1
你看过这个吗?您也可以将自己的小部件创建为AppBar并设置其高度。
Bostrot

@Leviathlon,我不好。检查我的答案是否有希望(希望有一些更好的帮助)

Answers:


208

您可以使用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 '18

11
@CopsOnRoad将其水平居中但不垂直居中。
Giraldi

1
@Giraldi您不能在不更改源文件或创建自定义的情况下真正做到这一点AppBar
CopsOnRoad

1
我知道@CopsOnRoad,但我只是指出了OP的要求。
Giraldi

46

您可以使用PreferredSizeflexibleSpace

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

这样,您可以保持elevationofAppBar的可见度并自定义高度,这正是我一直在寻找的。不过,您必须在中设置间距SomeWidget


这应该被接受的答案!非常感谢你。
哈扎阿

14

在撰写本文时,我尚未意识到PreferredSize。Cinn的答案更好地实现了这一点。

您可以创建一个具有自定义高度的自定义小部件:

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

Cinn的回答很好,但是有一个问题。

PreferredSize小部件将立即在屏幕顶部启动,而无需考虑状态栏,因此其某些高度将被状态栏的高度遮盖。这也说明了侧面缺口。

解决方案preferredSizeSafeArea

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

如果您不想使用flexibleSpace属性,则不需要所有这些,因为AppBarwill的其他属性会自动占据状态栏。


但这SafeArea是为了减少状态栏的高度,但是您又用MediaQuery.of(context).padding.top?添加了它?我认为这里不需要SafeArea。
莱德

@Ryde这SafeArea很重要,因此应用程序栏不会与状态栏重叠,但是MediaQuery.of(context).padding.top实际上并不需要。我已经编辑了答案,谢谢。
TN888 '20

1

您可以使用Appbar的toolbarHeight属性,它确实可以满足您的要求。


0

用途toolbarHeight

在此处输入图片说明


不再需要使用PreferredSizetoolbarHeight与一起使用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
这不是他要的。他希望标题垂直居中
雷米Rousselet

centerTitle:true; 可以用来做。
goops17 '18

垂直中心,而不是水平
雷米Rousselet

因此,它不会读取新的高度。我不认为修改app_bar.dart这样的源文件来更改它不是一个好主意。
goops17 '18

6
曾经编辑过框架的源代码是一个非常糟糕的主意。如果您更新框架,它将破坏您的应用程序。
康斯坦丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.