注意:無特殊說明,Flutter版本及Dart版本以下:git
- Flutter版本: 1.12.13+hotfix.5
- Dart版本: 2.7.0
BottomNavigationBar 和 BottomNavigationBarItem配合Scaffold控件使用能夠實現底部導航效果,相似於微信底部的導航效果,下面是一個簡單的底部導航案例:github
Scaffold( bottomNavigationBar: BottomNavigationBar( items: <BottomNavigationBarItem>[ BottomNavigationBarItem(title: Text('首頁'),icon: Icon(Icons.home)), BottomNavigationBarItem(title: Text('書籍'),icon: Icon(Icons.book)), BottomNavigationBarItem(title: Text('個人'),icon: Icon(Icons.perm_identity)), ], ), );
效果:微信
點擊其餘2個item時沒有反應,添加切換效果:ide
int _currentIndex = 0; BottomNavigationBar( onTap: (int index) { setState(() { _currentIndex = index; }); }, currentIndex: _currentIndex, ...
currentIndex
表明當前顯示導航的索引,當前切換時調用onTap
,在onTap
回調中調用setState
方法改變_currentIndex的值達到切換的效果。字體
效果以下:動畫
BottomNavigationBar有2種顯示模式,其中一種是fixed
效果,前面的展現就是fixed
效果,這也是默認值,另外一種是shifting
效果,ui
BottomNavigationBar( type:BottomNavigationBarType.shifting, selectedItemColor: Theme.of(context).primaryColor, unselectedItemColor: Colors.black, ... }
設置shifting
時須要設置selectedItemColor
和 unselectedItemColor
,效果以下:.net
咱們還能夠設置其背景顏色(backgroundColor
)、圖標大小(iconSize
)、選中和未選中圖標、字體的顏色,大小等。設計
若是導航的圖標是本身設計的圖標,這時僅僅經過BottomNavigationBar是沒法實現咱們想要的效果的,好比微信的導航的效果,雖然選中和未選中也是顏色的區別,但圖標不是Icons自帶的圖標,想要實現切換2個圖標須要BottomNavigationBarItem
控件的支持,其中的icon
和activeIcon
分別表明未選中和選中。3d
經過切換導航而改變頁面是App中最經常使用的方式,開始構建頁面的切換:
int _currentIndex = 0; Widget _currBody = HomePage(); _onTap(int index) { switch (index) { case 0: _currBody = HomePage();; break; case 1: _currBody = BookPage(); break; case 2: _currBody = MyPage(); break; } setState(() { _currentIndex = index; }); } Scaffold( body: _currBody, bottomNavigationBar: BottomNavigationBar( onTap: _onTap, type: BottomNavigationBarType.shifting, selectedItemColor: Theme.of(context).primaryColor, unselectedItemColor: Colors.black, currentIndex: _currentIndex, items: <BottomNavigationBarItem>[ BottomNavigationBarItem(title: Text('首頁'), icon: Icon(Icons.home)), BottomNavigationBarItem(title: Text('書籍'), icon: Icon(Icons.book)), BottomNavigationBarItem( title: Text('個人'), icon: Icon(Icons.perm_identity)), ], ), );
Scaffold控件的body
表示導航上面,AppBar下面的頁面,HomePage
,BookPage
,MyPage
對應3個導航的頁面,背景分別是紅、藍、黃色,效果以下: