Flutter 10: 圖解底部狀態(tài)欄小嘗試

??????小菜今天來整理一下在學習測試 Flutter 時需用到的底部導航欄 BottomNavigationBar,使用方式很簡單脏榆,小菜感覺效果比原生的 Android 要好一些猖毫。

何為 BottomNavigationBar ?

??????BottomNavigationBar 為底部導航欄控件,可以包含文字標簽和圖標等基本信息须喂,通常在三到五個之間吁断;據(jù)了解,iOS 的規(guī)范底部導航欄最多可設置五個坞生,所以大部分應用均在五個以內(nèi)仔役;現(xiàn)在很多應用都是以底部導航欄 + 中部主內(nèi)容 Content 方式來展示。
??????官網(wǎng)建議是己,BottomNavigationBar 底部導航欄通常與 Scaffold 一起使用又兵,其中它作為Scaffold.bottomNavigationBar 參數(shù)提供。

如何應用 BottomNavigationBar ?

  1. 與 body 同級的位置添加 BottomNavigationBar卒废,BottomNavigationBarItem 中可以添加文字標簽或圖標 (Icons/Image) 等沛厨,若圖片不存在時會顯示空白宙地;這樣就可以添加底部狀態(tài)欄內(nèi)容,文字和圖標的樣式也可以隨意調(diào)整逆皮;如下:
bottomNavigationBar: new BottomNavigationBar(
  type: BottomNavigationBarType.fixed,
  items: [
    BottomNavigationBarItem(
        icon: new Icon(Icons.category), title: new Text('簽到')),
    BottomNavigationBarItem(
        icon: new Icon(Icons.account_circle), title: new Text('我')),
  ],
),
  1. 只有底部狀態(tài)欄是不夠的宅粥,還需要對應的中間展示內(nèi)容塊,可以跟 Android 的思路一樣页屠,添加幾個 Page() 頁作為 Fragment粹胯,小菜因為測試內(nèi)容相對簡單蓖柔,嘗試使用了 PageView辰企,即對應 Android 中的 ViewPager,小菜會在今后的測試中詳細說明况鸣,今天主要是使用基本方法展示主模塊內(nèi)容牢贸;如下:
body: new PageView.builder(
  itemBuilder: (BuildContext context, int index) {
    var str =
        (index == 0) ? "這里是【HomePage】->【簽到】頁面" : "這里是【HomePage】->【我】頁面";
    return new Center(
        child: new Container(
      width: 340.0,
      child: new Card(
          color: Colors.blue,
          elevation: 16.0,
          child: new FlatButton(
            child:
                new Text(str, style: new TextStyle(color: Colors.white)),
          )),
    ));
  },
  itemCount: 2,
),
  1. 此時主模塊 PageView 可以滑動切換內(nèi)容,但是對應的底部狀態(tài)欄不會變化镐捧;因為目前沒有綁定對應的點擊事件等潜索;此時需要添加 PageController 和 狀態(tài)欄的 onTap 點擊事件;如下:
int _currentIndex = 0;
var _pageController = new PageController(initialPage: 0);
void _pageChange(int index) {
    if (_currentIndex != index) {
      _currentIndex = index;
    }
}
// 添加 PageView 的 PageController
body: new PageView.builder(
  onPageChanged: _pageChange,
  controller: _pageController,
  itemBuilder: (BuildContext context, int index) {
    ...
  }
),
// 添加 BottomNavigationBar 的 onTap
bottomNavigationBar: new BottomNavigationBar(
  type: BottomNavigationBarType.fixed,
  items: [
    ...
  ],
  //設置當前的索引
  currentIndex: _currentIndex,
  //tabBottom的點擊監(jiān)聽
  onTap: (int index) {
    _pageController.animateToPage(index,
        duration: new Duration(seconds: 2),
        curve: new ElasticOutCurve(0.8));
    _pageChange(index);
    _currentIndex = index;
  },
),
  1. 此時懂酱,點擊底部狀態(tài)欄對應的 PageView 會切換內(nèi)容竹习,但是底部狀態(tài)欄并沒有改變樣式,因為目前用的時固定的圖標和文字列牺,此時需要處理圖標和文字切換時的樣式整陌,如下:
var _bottomText = ['簽到', '我'];
var _bottomIcons = [
  [
    new Icon(Icons.category, color: Colors.grey),
    new Icon(Icons.category, color: Colors.blue),
  ],
  [
    new Icon(Icons.account_circle, color: Colors.grey),
    new Icon(Icons.account_circle, color: Colors.blue),
  ]
];
Icon changeIconStyle(int curIndex) {
  if (curIndex == _currentIndex) {
    return _bottomIcons[curIndex][1];
  }
  return _bottomIcons[curIndex][0];
}
Text changeTextStyle(int curIndex) {
  if (curIndex == _currentIndex) {
    return new Text(_bottomText[curIndex],
        style: new TextStyle(color: Colors.blue));
  } else {
    return new Text(_bottomText[curIndex],
        style: new TextStyle(color: Colors.grey));
  }
}

bottomNavigationBar: new BottomNavigationBar(
  type: BottomNavigationBarType.fixed,
  items: [
    new BottomNavigationBarItem(
        icon: changeIconStyle(0), title: changeTextStyle(0)),
    new BottomNavigationBarItem(
        icon: changeIconStyle(1), title: changeTextStyle(1)),
  ],
  ...
),
  1. 然而小菜添加了更改狀態(tài)時的樣式,點擊底部狀態(tài)欄時依舊不會變色瞎领;小菜查了很久突然發(fā)現(xiàn)泌辫,小菜的 HomePage() 繼承的是 StatelessWidget 無狀態(tài)樣式,此時更換為 StatefulWidget 有狀態(tài)樣式九默,并實現(xiàn)對應方法震放;如下:
class HomePage extends StatefulWidget {
  String result;

  HomePage(this.result);

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  int _currentIndex = 0;
  ...
}

??????至此,底部狀態(tài)欄 BottomNavigationBar 配合滑動 PageView 的基本功能已經(jīng)完成驼修。

實用小貼士

  1. 通過點擊 BottomNavigationBar 對 PageView 切換過程中殿遂,可以設置動畫過程,也可以直接跳轉(zhuǎn)到對應頁面乙各,需要設置 animateToPage 或 jumpToPage墨礁;如下:
onTap: (int index) {
    // 切換時沒有動畫效果
//    _pageController.jumpToPage(index);
    // 切換時添加動畫效果
    _pageController.animateToPage(index,
        duration: new Duration(seconds: 2),
        curve: new ElasticOutCurve(0.8));
    _pageChange(index);
    _currentIndex = index;
},
  1. BottomNavigationBar 有兩種樣式分別為 shiftingfixed;直接效果圖觅丰,shifting 樣式時會突出顯示選中的 item饵溅,其他的 item 文字隱藏;fixed 樣式均分妇萄,沒有突出效果蜕企;如下:

type: BottomNavigationBarType.shifting,

shifting

shifting

type: BottomNavigationBarType.fixed,

fixed
fixed

??????GitHub Demo


??????小菜剛接觸 Flutter 時間不長咬荷,還有很多不清楚和不理解的地方,如果又不對的地方還希望多多指出轻掩。

來源:阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幸乒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唇牧,更是在濱河造成了極大的恐慌罕扎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐重,死亡現(xiàn)場離奇詭異腔召,居然都是意外死亡,警方通過查閱死者的電腦和手機扮惦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門臀蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崖蜜,你說我怎么就攤上這事浊仆。” “怎么了豫领?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵抡柿,是天一觀的道長。 經(jīng)常有香客問我等恐,道長洲劣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任鼠锈,我火速辦了婚禮闪檬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘购笆。我一直安慰自己粗悯,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布同欠。 她就那樣靜靜地躺著样傍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铺遂。 梳的紋絲不亂的頭發(fā)上衫哥,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音襟锐,去河邊找鬼撤逢。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蚊荣。 我是一名探鬼主播初狰,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼互例!你這毒婦竟也來了奢入?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媳叨,失蹤者是張志新(化名)和其女友劉穎腥光,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糊秆,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡武福,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扩然。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艘儒。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡聋伦,死狀恐怖夫偶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情觉增,我是刑警寧澤兵拢,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站逾礁,受9級特大地震影響说铃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘹履,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一腻扇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砾嫉,春花似錦幼苛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至配并,卻和暖如春括荡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溉旋。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工畸冲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓邑闲,卻偏偏與公主長得像岩喷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子监憎,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1纤虽、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,982評論 3 119
  • 1、熬骨頭湯痘系。 2艺智、煮魚骨,加紅辣椒褐筛、郫縣豆瓣醬类少。 3、炒豆芽渔扎、土豆等配料硫狞,放入盆中,再將魚骨撈出放到配料上面晃痴。 ...
    清風騰逸閱讀 572評論 0 49
  • 想了好久残吩,終于決定開始了。我沒有任何你想看到的精彩的故事倘核,我太普通了泣侮,我想這只是我寫給自己的情書。有的只是...
    z張三瘋閱讀 573評論 0 1
  • 文/秋葉 過年和平常不一樣,過年那幾天漏益,人人臉上溢著快樂蛹锰,嘴里說的都是好聽話,吉祥如意健康……所有寓意好的詞句绰疤,在...
    漫步秋葉閱讀 679評論 0 5