Flutter 底部導(dǎo)航欄練習(xí)

我們?cè)谑褂么蠖鄶?shù)應(yīng)用類APP的時(shí)候都會(huì)發(fā)現(xiàn)幾乎每個(gè)APP底部都有導(dǎo)航欄圃郊,比如微信下面有聊天甫男、通訊錄且改、發(fā)現(xiàn)、我的這幾個(gè)導(dǎo)航標(biāo)簽板驳,可以快速的定位到對(duì)應(yīng)的功能頁面又跛,而且我們會(huì)發(fā)現(xiàn)底部導(dǎo)航標(biāo)簽引導(dǎo)的區(qū)域基本是相對(duì)獨(dú)立的,也就是說每一個(gè)導(dǎo)航功能對(duì)應(yīng)的都是各自要展現(xiàn)的獨(dú)立內(nèi)容笋庄。這個(gè)功能的實(shí)現(xiàn)需要用到flutter里的BottonNavigationBar這個(gè)控件效扫。

項(xiàng)目說明:實(shí)現(xiàn)一個(gè)底部導(dǎo)航欄,包含3到4個(gè)功能標(biāo)簽直砂,點(diǎn)擊對(duì)應(yīng)的導(dǎo)航標(biāo)簽可以切換到對(duì)應(yīng)的頁面內(nèi)容菌仁,并且頁面抬頭顯示的內(nèi)容也會(huì)跟著改變。
實(shí)際上由于手機(jī)屏幕大小的限制静暂,底部導(dǎo)航欄的功能標(biāo)簽一般在3到5個(gè)左右济丘,如果太多,會(huì)比較擁擠洽蛀,影響用戶體驗(yàn)摹迷,實(shí)際上目前市面上大多數(shù)APP的底部導(dǎo)航標(biāo)簽都控制在4到5個(gè)左右。既美觀郊供、又不會(huì)讓用戶覺得功能繁雜峡碉。

下面擼碼:
首先我們新建一個(gè)底部導(dǎo)航控件,由于點(diǎn)擊導(dǎo)航標(biāo)簽的時(shí)候頁面內(nèi)容是會(huì)發(fā)生改變的驮审,所以這是一個(gè)有狀態(tài)的控件鲫寄。

import 'package:flutter/material.dart';

class BottomNavigationWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new BottomNavigationWidgetState();
  }
}

class BottomNavigationWidgetState extends State<BottomNavigationWidget> {
  int _currentIndex = 0;

  @override
  Widget build(BuildContext context) {
    /*
    返回一個(gè)腳手架,里面包含兩個(gè)屬性疯淫,一個(gè)是底部導(dǎo)航欄地来,另一個(gè)就是主體內(nèi)容
     */
    return new Scaffold(
      bottomNavigationBar: BottomNavigationBar(
        //底部導(dǎo)航欄的創(chuàng)建需要對(duì)應(yīng)的功能標(biāo)簽作為子項(xiàng),這里我就寫了3個(gè)熙掺,每個(gè)子項(xiàng)包含一個(gè)圖標(biāo)和一個(gè)title未斑。
        items: [
          BottomNavigationBarItem(
              icon: Icon(
                Icons.home,
              ),
              title: new Text(
                '首頁',
              )),
          BottomNavigationBarItem(
              icon: Icon(
                Icons.business,
              ),
              title: new Text(
                '商業(yè)',
              )),
          BottomNavigationBarItem(
              icon: Icon(
                Icons.mood,
              ),
              title: new Text(
                '我的',
              )),
        ],
        //這是底部導(dǎo)航欄自帶的位標(biāo)屬性,表示底部導(dǎo)航欄當(dāng)前處于哪個(gè)導(dǎo)航標(biāo)簽币绩。給他一個(gè)初始值0蜡秽,也就是默認(rèn)第一個(gè)標(biāo)簽頁面府阀。
        currentIndex: _currentIndex,
        //這是點(diǎn)擊屬性,會(huì)執(zhí)行帶有一個(gè)int值的回調(diào)函數(shù)载城,這個(gè)int值是系統(tǒng)自動(dòng)返回的你點(diǎn)擊的那個(gè)標(biāo)簽的位標(biāo)
        onTap: (int i) {
          //進(jìn)行狀態(tài)更新肌似,將系統(tǒng)返回的你點(diǎn)擊的標(biāo)簽位標(biāo)賦予當(dāng)前位標(biāo)屬性费就,告訴系統(tǒng)當(dāng)前要顯示的導(dǎo)航標(biāo)簽被用戶改變了诉瓦。
          setState(() {
            _currentIndex = i;
          });
        },
      ),
    );
  }
}

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: '底部導(dǎo)航演示',
      home: new BottomNavigationWidget(),
    );
  }
}

運(yùn)行后你會(huì)發(fā)現(xiàn)顯示效果如下,點(diǎn)擊底部標(biāo)簽會(huì)有一個(gè)顏色狀態(tài)的變化:


Screenshot_1538049889.png
Screenshot_1538049891.png

到這里其實(shí)基本實(shí)現(xiàn)了底部導(dǎo)航欄的功能力细,下面我們?cè)黾狱c(diǎn)擊導(dǎo)航標(biāo)簽睬澡,對(duì)應(yīng)的上面內(nèi)容也會(huì)隨著變化。
首先我們新建3個(gè)dart文件眠蚂,用于新建3個(gè)主體展示頁面煞聪,這三個(gè)頁面都是帶一個(gè)appbar和body,appbar用于顯示對(duì)應(yīng)的導(dǎo)航標(biāo)簽逝慧,body里顯示對(duì)應(yīng)的他們的標(biāo)簽大圖標(biāo)昔脯。三個(gè)文件的寫法基本是一致的。
第一個(gè) HomePAGE:

import 'package:flutter/material.dart';

class HomePageWidget extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return new HomePageWidgetState();
  }
}

class HomePageWidgetState extends State<HomePageWidget>{
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('首頁'),
      ),
      body: new Center(
        child: Icon(Icons.home,size: 130.0,color: Colors.blue,),
      ),
    );
  }
}

第二個(gè) BusinessPage:

import 'package:flutter/material.dart';

class BusinessPageWidget extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return new BusinessPageWidgetState();
  }
}

class BusinessPageWidgetState extends State<BusinessPageWidget>{
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('商業(yè)'),
      ),
      body: new Center(
        child: Icon(Icons.business,size: 130.0,color: Colors.blue,),
      ),
    );
  }
}

第三個(gè) Mypage:

import 'package:flutter/material.dart';

class MyPageWidget extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return new MyPageWidgetState();
  }
}

class MyPageWidgetState extends State<MyPageWidget>{
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('我的'),
      ),
      body: new Center(
        child: Icon(Icons.mood,size: 130.0,color: Colors.blue,),
      ),
    );
  }
}

然后回到底部導(dǎo)航欄文件笛臣,我們需要導(dǎo)入這3個(gè)頁面文件:

import 'homePage.dart';
import 'businessPage.dart';
import 'myPage.dart';

由于在點(diǎn)擊導(dǎo)航標(biāo)簽的時(shí)候要能對(duì)應(yīng)改變上面主體內(nèi)容云稚,而且顯示的內(nèi)容是要和點(diǎn)擊的導(dǎo)航標(biāo)簽相對(duì)應(yīng),所以我們這里還是通過位標(biāo)來實(shí)現(xiàn)沈堡,因?yàn)槊總€(gè)導(dǎo)航標(biāo)簽是有一個(gè)位標(biāo)的静陈,那么只要我們點(diǎn)擊標(biāo)簽的那個(gè)位標(biāo)等同于要展示頁面的值,就會(huì)對(duì)應(yīng)顯示了诞丽。所以我們可以把三個(gè)頁面放在一個(gè)List里:

List<Widget> pages = new List();
  @override
//initState是初始化函數(shù)鲸拥,在繪制底部導(dǎo)航控件的時(shí)候就把這3個(gè)頁面添加到list里面用于下面跟隨標(biāo)簽導(dǎo)航進(jìn)行切換顯示
  void initState() {
    pages
      ..add(HomePageWidget())
      ..add(BusinessPageWidget())
      ..add(MyPageWidget());
  }

然后在底部導(dǎo)航欄的Scaffold中的body配置跟隨導(dǎo)航標(biāo)簽要顯示的頁面:

//主體顯示的頁面跟隨當(dāng)前導(dǎo)航標(biāo)簽的位標(biāo)值在pages頁面列表中選擇。
body: pages[_currentIndex]

程序跑起來點(diǎn)擊導(dǎo)航標(biāo)簽顯示如下:


底部導(dǎo)航.gif

=============================我割===========================
上面已經(jīng)把本次練習(xí)的主要目的底部導(dǎo)航實(shí)現(xiàn)了僧免,但是關(guān)于底部導(dǎo)航的一些顯示小細(xì)節(jié)就是關(guān)于點(diǎn)擊的效果這里也給大家大家舉個(gè)例子:
一個(gè)就是上面那種默認(rèn)圖標(biāo)刑赶、標(biāo)題都存在,點(diǎn)擊對(duì)應(yīng)的標(biāo)簽顏色變化懂衩。
還有一種就是默認(rèn)只顯示圖標(biāo)撞叨,只有在點(diǎn)擊后才會(huì)顯示標(biāo)題,而且會(huì)有一個(gè)小的動(dòng)畫效果勃痴,這個(gè)就要用到底部導(dǎo)航的的type屬性:

type: BottomNavigationBarType.shifting

但是使用這個(gè)以后由于我之前的代碼沒有給圖標(biāo)和標(biāo)題設(shè)置顏色谒所,所以是一片白色,想要嘗試的朋友記得設(shè)置圖標(biāo)顏色沛申,我設(shè)置成色以后點(diǎn)擊效果就是這樣的:


底部導(dǎo)航-2.gif

你覺得兩種效果哪種更好看呢劣领?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铁材,隨后出現(xiàn)的幾起案子尖淘,更是在濱河造成了極大的恐慌奕锌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件村生,死亡現(xiàn)場(chǎng)離奇詭異惊暴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趁桃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門辽话,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卫病,你說我怎么就攤上這事油啤。” “怎么了蟀苛?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵益咬,是天一觀的道長。 經(jīng)常有香客問我帜平,道長幽告,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任裆甩,我火速辦了婚禮冗锁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淑掌。我一直安慰自己蒿讥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布抛腕。 她就那樣靜靜地躺著芋绸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪担敌。 梳的紋絲不亂的頭發(fā)上摔敛,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音全封,去河邊找鬼马昙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刹悴,可吹牛的內(nèi)容都是我干的行楞。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼土匀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼子房!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤证杭,失蹤者是張志新(化名)和其女友劉穎田度,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體解愤,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镇饺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了送讲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸笤。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖李茫,靈堂內(nèi)的尸體忽然破棺而出揭保,到底是詐尸還是另有隱情,我是刑警寧澤魄宏,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站存筏,受9級(jí)特大地震影響宠互,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椭坚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一予跌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧善茎,春花似錦券册、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耕赘,卻和暖如春骄蝇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背操骡。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工九火, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人册招。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓岔激,卻偏偏與公主長得像,于是被迫代替她去往敵國和親是掰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虑鼎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350