Flutter入門(15):Flutter 組件之 BottomNavigationBar 詳解

1. 基本介紹

BottomNavigationBar 提供了常見的底部導(dǎo)航條功能绵估。

2. 示例代碼

代碼下載地址础淤。如果對你有幫助的話記得給個關(guān)注,代碼會根據(jù)我的 Flutter 專題不斷更新。

3. 屬性介紹

BottomNavigationBar屬性 介紹
items 必填項蛇数,設(shè)置各個按鈕,
onTap 點擊事件
currentIndex 當(dāng)前選中 item 下標
elevation 控制陰影高度称近,默認為 8.0
type BottomNavigationBarType撇贺,默認 fixed趟脂,設(shè)置為 shifting 時,建議設(shè)置選中樣式抢韭,和為選中樣式薪贫,提供一個特殊動畫
fixedColor 選中 item 填充色
backgroundColor 整個 BottomNavigationBar 背景色
iconSize 圖標大小,默認 24.0
selectedItemColor 選中 title 填充色
unselectedItemColor 未選中 title 填充色
selectedIconTheme 選中 item 圖標主題
unselectedIconTheme 未選中 item 圖標主題
selectedFontSize 選中 title 字體大小刻恭,默認14.0
unselectedFontSize 未選中 title 字體大小瞧省,默認12.0
selectedLabelStyle 選中 title 樣式 TextStyle
unselectedLabelStyle 未選中 title 樣式 TextStyle
showSelectedLabels 是否展示選中 title,默認為true
showUnselectedLabels 是否展示未選中 title鳍贾,默認為true
mouseCursor 鼠標懸停鞍匾,Web 開發(fā)可以了解

4. BottomNavigationBar 組件

4.1 容器創(chuàng)建

優(yōu)雅的編程,首先創(chuàng)建一個 bottomnavigationbar.dart 文件贾漏。由于之后有頁面效果變化候学,所以這里繼承 StatefulWidgets。

import 'package:flutter/material.dart';

class FMBottomNavBarVC extends StatefulWidget {
  @override
  FMBottomNavBarState createState() => FMBottomNavBarState();
}

class FMBottomNavBarState extends State <FMBottomNavBarVC>{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('BottomNavigationBar'),
      ),
      bottomNavigationBar: _bottomNavigationBar(),
      body: Container(),
    );
  }

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
    );
  }

  List<BottomNavigationBarItem> _items(){
    return [
      BottomNavigationBarItem(
        icon: Icon(Icons.title),
        title: Text('title'),
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.favorite),
        title: Text('favorite'),
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.backspace),
        title: Text('backspace'),
      ),
    ];
  }
}

4.2 items

使用 items 設(shè)置底部按鈕纵散。


bottom navbar items.png

4.3 onTap

使用 onTap 捕獲 items 的點擊事件,我們來一次點擊下方按鈕隐圾,看一下打印結(jié)果伍掀。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        print("選中 index = ${index}");
      },
    );
  }
bottom navbar ontap.png

4.4 currentIndex

設(shè)置當(dāng)前高亮的 item,下邊我們來實現(xiàn)以下點擊按鈕暇藏,切換到對應(yīng)的按鈕高亮蜜笤。我們先聲明一個變量記錄下標,在 item 點擊時盐碱,記錄點擊的 item 下標把兔,刷新頁面沪伙。在使用 currentIndex 屬性改變頁面高亮按鈕為變量保存的這個 item。

  var _selectedIndex = 0;
  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
    );
  }
navbar currentIndex 0.png

navbar currentIndex 1.png

navbar currentIndex 2.png

4.5 type

使用 type 屬性更改下方按鈕樣式县好。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      type: BottomNavigationBarType.shifting,
    );
  }
nav type fixed.png

nav type shifting.png

4.6 fixedColor, unselectedItemColor

使用 fixedColor 改變按鈕選中時填充色围橡,unselectedItemColor 改變未選中時的填充色。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      // type: BottomNavigationBarType.shifting,
      fixedColor: Colors.green,
      unselectedItemColor: Colors.red,
      iconSize: 30,
    );
  }
navbar fillColor.png

4.7 iconSize

使用 iconSize 改變圖標大小缕贡。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      // type: BottomNavigationBarType.shifting,
      fixedColor: Colors.green,
      iconSize: 30,
    );
  }
navbar iconSize.png

4.8 selectedFontSize, unselectedFontSize

使用 selectedFontSize 設(shè)置選中時 title 字體大小翁授,默認14。
使用 unselectedFontSize 設(shè)置未選中時 title 字體大小晾咪,默認12收擦。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      // type: BottomNavigationBarType.shifting,
      fixedColor: Colors.green,
      unselectedItemColor: Colors.red,
      iconSize: 30,
      selectedFontSize: 16,
      unselectedFontSize: 11,
    );
  }
navbar fontSize.png

4.9 selectedLabelStyle, unselectedLabelStyle

使用 selectedLabelStyle 設(shè)置選中時 title 字體樣式。
使用 unselectedLabelStyle 設(shè)置選中時 title 字體樣式谍倦。

注意:顏色受 fixedColor塞赂,unselectedItemColor 顏色影響,所以這兩項沒有效果昼蛀。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      // type: BottomNavigationBarType.shifting,
      fixedColor: Colors.green,
      unselectedItemColor: Colors.red,
      iconSize: 30,
      selectedFontSize: 16,
      unselectedFontSize: 11,
      selectedLabelStyle: TextStyle(
        color: Colors.yellow,
        fontSize: 12
      ),
      unselectedLabelStyle: TextStyle(
        color: Colors.cyan,
      ),
    );
  }
navbar label style.png

4.10 showSelectedLabels, showUnselectedLabels

使用 showSelectedLabels 設(shè)置選中時是否顯示 title宴猾,默認為 true。
使用 showUnselectedLabels 設(shè)置選中時是否顯示 title曹洽,默認為 true鳍置。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      // type: BottomNavigationBarType.shifting,
      fixedColor: Colors.green,
      unselectedItemColor: Colors.red,
      iconSize: 30,
      selectedFontSize: 16,
      unselectedFontSize: 11,
      selectedLabelStyle: TextStyle(
        color: Colors.yellow,
        fontSize: 12
      ),
      unselectedLabelStyle: TextStyle(
        color: Colors.cyan,
      ),
      showSelectedLabels: false,
      showUnselectedLabels: false,
    );
  }
navbar showlabels.png

4.11 selectedIconTheme, unselectedIconTheme

使用 selectedIconTheme 設(shè)置選中時 icon 主題。
使用 unselectedIconTheme 設(shè)置選中時 icon 主題送淆。
注意:主題設(shè)置的優(yōu)先級較高税产,如果同時設(shè)置了上述其他屬性,優(yōu)先執(zhí)行主題設(shè)置偷崩。

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: _items(),
      onTap: (int index){
        _selectedIndex = index;
        print("選中 index = ${index}");
        setState(() {

        });
      },
      currentIndex: _selectedIndex,
      // type: BottomNavigationBarType.shifting,
      fixedColor: Colors.green,
      unselectedItemColor: Colors.red,
      iconSize: 30,
      selectedFontSize: 16,
      unselectedFontSize: 11,
      selectedLabelStyle: TextStyle(
        color: Colors.yellow,
        fontSize: 12
      ),
      unselectedLabelStyle: TextStyle(
        color: Colors.cyan,
      ),
      showSelectedLabels: false,
      showUnselectedLabels: false,
      selectedIconTheme: IconThemeData(
        color: Colors.black,
        size: 24,
      ),
      unselectedIconTheme: IconThemeData(
        color: Colors.black,
        size: 24,
      ),
    );
  }
navbar iconTheme.png

5. 技術(shù)小結(jié)

  • BottomNavigationBar 應(yīng)用非常廣泛辟拷。
  • 沒有太多自定義空間,主要就是顏色字體圖標的設(shè)置阐斜,多試一試各種屬性就可以掌握衫冻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谒出,隨后出現(xiàn)的幾起案子隅俘,更是在濱河造成了極大的恐慌,老刑警劉巖笤喳,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件为居,死亡現(xiàn)場離奇詭異,居然都是意外死亡杀狡,警方通過查閱死者的電腦和手機蒙畴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呜象,“玉大人膳凝,你說我怎么就攤上這事碑隆。” “怎么了蹬音?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵上煤,是天一觀的道長。 經(jīng)常有香客問我祟绊,道長楼入,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任牧抽,我火速辦了婚禮嘉熊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扬舒。我一直安慰自己阐肤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布讲坎。 她就那樣靜靜地躺著孕惜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晨炕。 梳的紋絲不亂的頭發(fā)上衫画,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音瓮栗,去河邊找鬼削罩。 笑死,一個胖子當(dāng)著我的面吹牛费奸,可吹牛的內(nèi)容都是我干的弥激。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼愿阐,長吁一口氣:“原來是場噩夢啊……” “哼微服!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缨历,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤以蕴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辛孵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舒裤,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年觉吭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仆邓。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲜滩,死狀恐怖伴鳖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情徙硅,我是刑警寧澤榜聂,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站嗓蘑,受9級特大地震影響须肆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桩皿,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一豌汇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泄隔,春花似錦拒贱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暖呕,卻和暖如春斜做,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背湾揽。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工瓤逼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钝腺。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓抛姑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艳狐。 傳聞我的和親對象是個殘疾皇子定硝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350