Flutter組件之AppBar

圖解


AppBar圖解.png

AppBar常用屬性

AppBar({
    Key key,
    this.leading,
    this.automaticallyImplyLeading = true,
    this.title,
    this.actions,
    this.flexibleSpace,
    this.bottom,
    this.elevation,
    this.shape,
    this.backgroundColor,
    this.brightness,
    this.iconTheme,
    this.actionsIconTheme,
    this.textTheme,
    this.primary = true,
    this.centerTitle,
    this.titleSpacing = NavigationToolbar.kMiddleSpacing,
    this.toolbarOpacity = 1.0,
    this.bottomOpacity = 1.0,
  })
  • leading 左側(cè)顯示的圖標(biāo) 通常首頁(yè)顯示的為應(yīng)用logo 在其他頁(yè)面為返回按鈕
  • automaticallyImplyLeading 配合leading使用
  • title 標(biāo)題文本
  • actions 右側(cè)item
  • flexibleSpace 顯示在 AppBar 下方的控件爷耀,高度和 AppBar 高度一樣闸氮,可以實(shí)現(xiàn)一些特殊的效果嗜历,該屬性通常在 SliverAppBar 中使用
  • bottom 一個(gè) AppBarBottomWidget 對(duì)象滑潘,通常是 TabBar腥光。用來(lái)在 Toolbar 標(biāo)題下面顯示一個(gè) Tab 導(dǎo)航欄
  • elevation 控件的 z 坐標(biāo)順序枫弟,默認(rèn)值 4,對(duì)于可滾動(dòng)的 SliverAppBar洽腺,當(dāng) SliverAppBar 和內(nèi)容同級(jí)的時(shí)候脚粟,該值為 0, 當(dāng)內(nèi)容滾動(dòng) SliverAppBar 變?yōu)?Toolbar 的時(shí)候蘸朋,修改 elevation 的值核无。
  • shape
  • backgroundColor AppBar背景色
  • brightness AppBar亮度 有黑白兩種主題
  • iconTheme AppBar上圖標(biāo)的樣式
  • actionsIconTheme AppBar上actions圖標(biāo)的樣式
  • textTheme AppBar上文本樣式
  • centerTitle 標(biāo)題是否居中
  • titleSpacing 標(biāo)題與其他控件的空隙
  • toolbarOpacity AppBar tool區(qū)域透明度
  • bottomOpacity bottom區(qū)域透明度

代碼示例

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() => runApp(BasicAppBarSample());

class BasicAppBarSample extends StatefulWidget {
  @override
  _BasicAppBarSample createState() => _BasicAppBarSample();
}

class _BasicAppBarSample extends State<BasicAppBarSample> {
  Choice _selectedChoice = choices[0];

  void _select(Choice choice) {
    setState(() {
      _selectedChoice = choice;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          leading: Icon(Icons.home),
          automaticallyImplyLeading: true,
          title: Text('AppBar'),
          centerTitle: true,
          brightness: Brightness.dark,
          titleSpacing: NavigationToolbar.kMiddleSpacing,
          toolbarOpacity: 1.0,
            bottomOpacity: 1.0,
            primary: true,
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.search),
              tooltip: "搜索",
              onPressed: () {
                print("搜索");
              },
            ),
            /**
                PopupMenuButton<String>(
                itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
                PopupMenuItem<String>(child: Text('發(fā)起群聊'),value: 'chat',),
                PopupMenuItem<String>(child: Text('添加朋友'),value: 'add',),
                PopupMenuItem<String>(child: Text('掃一掃'),value: 'scan',),
                PopupMenuItem<String>(child: Text('收付款'),value: 'pay',),
                ],
                onSelected: (String action){
                switch(action){
                case "chat":
                print("發(fā)起群聊");
                break;
                case "add":
                print("添加朋友");
                break;
                case "scan":
                print("掃一掃");
                break;
                case "pay":
                print("收付款");
                break;
                }
                },
                ),
             */
            PopupMenuButton<Choice>(
              onSelected: _select,
              itemBuilder: (BuildContext context) {
                return choices.map<PopupMenuItem<Choice>>((Choice choice) {
                  return PopupMenuItem<Choice>(
                    value: choice,
                    child: PopupMenuItemCard(
                      choice: Choice(title: choice.title, icon: choice.icon),
                    ),
                  );
                }).toList();
              },
            ),
          ],
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: ChoiceCard(choice: _selectedChoice),
        ),
      ),
    );
  }
}

class Choice {
  const Choice({this.title, this.icon});

  final String title;
  final IconData icon;
}

const List<Choice> choices = <Choice>[
  Choice(title: '發(fā)起群聊', icon: Icons.chat),
  Choice(title: '添加朋友', icon: Icons.add_call),
  Choice(title: '掃一掃', icon: Icons.scanner),
  Choice(title: '收付款', icon: Icons.payment),
];

class PopupMenuItemCard extends StatelessWidget {
  const PopupMenuItemCard({Key key, this.choice}) : super(key: key);

  final Choice choice;

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    final TextStyle textStyle = Theme.of(context).textTheme.headline;

     return  Row(
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Icon(choice.icon, size: 20.0, color: textStyle.color),
          Container(
            padding: const EdgeInsets.only(left: 15.0),
            child: Text(choice.title, style: TextStyle(fontSize: 18)),
          )

        ],
      );
  }
}

class ChoiceCard extends StatelessWidget {
  const ChoiceCard({Key key, this.choice}) : super(key: key);

  final Choice choice;

  @override
  Widget build(BuildContext context) {
    final TextStyle textStyle = Theme.of(context).textTheme.headline;
    return Card(
      color: Colors.white,
      child: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Icon(choice.icon, size: 128.0, color: textStyle.color,),
            Text(choice.title, style: textStyle),
          ],
        ),
      ),
    );
  }
}

demo效果


AppBar效果圖1.png
AppBar效果圖2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市藕坯,隨后出現(xiàn)的幾起案子团南,更是在濱河造成了極大的恐慌,老刑警劉巖炼彪,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吐根,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辐马,警方通過(guò)查閱死者的電腦和手機(jī)拷橘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喜爷,“玉大人冗疮,你說(shuō)我怎么就攤上這事¢菡剩” “怎么了术幔?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)湃密。 經(jīng)常有香客問(wèn)我诅挑,道長(zhǎng),這世上最難降的妖魔是什么泛源? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任揍障,我火速辦了婚禮,結(jié)果婚禮上俩由,老公的妹妹穿的比我還像新娘毒嫡。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布兜畸。 她就那樣靜靜地躺著努释,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咬摇。 梳的紋絲不亂的頭發(fā)上伐蒂,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音肛鹏,去河邊找鬼逸邦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛在扰,可吹牛的內(nèi)容都是我干的缕减。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芒珠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桥狡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起皱卓,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裹芝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后娜汁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嫂易,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年掐禁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怜械。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穆桂,死狀恐怖宫盔,靈堂內(nèi)的尸體忽然破棺而出融虽,到底是詐尸還是另有隱情享完,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布有额,位于F島的核電站般又,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巍佑。R本人自食惡果不足惜茴迁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萤衰。 院中可真熱鬧堕义,春花似錦、人聲如沸脆栋。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怕膛,卻和暖如春熟嫩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐捻。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工掸茅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柠逞。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓昧狮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親边苹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陵且,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354