Flutter Widgets 之 BottomNavigationBar 和 BottomNavigationBarItem
注意:無特殊說明,Flutter版本及Dart版本如下:
- Flutter版本: 1.12.13+hotfix.5
- Dart版本: 2.7.0
BottomNavigationBar 和 BottomNavigationBarItem配合Scaffold控制元件使用可以實現底部導航效果,類似於微信底部的導航效果,下面是一個簡單的底部導航案例:
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時沒有反應,新增切換效果:
int _currentIndex = 0;
BottomNavigationBar(
onTap: (int index) {
setState(() {
_currentIndex = index;
});
},
currentIndex: _currentIndex,
...
currentIndex
代表當前顯示導航的索引,當前切換時呼叫onTap
,在onTap
回撥中呼叫setState
方法改變_currentIndex的值達到切換的效果。
效果如下:
BottomNavigationBar有2種顯示模式,其中一種是fixed
效果,前面的展示就是fixed
效果,這也是預設值,另一種是shifting
效果,
BottomNavigationBar(
type:BottomNavigationBarType.shifting,
selectedItemColor: Theme.of(context).primaryColor,
unselectedItemColor: Colors.black,
...
}
設定shifting
時需要設定selectedItemColor
和 unselectedItemColor
我們還可以設定其背景顏色(backgroundColor
)、圖示大小(iconSize
)、選中和未選中圖示、字型的顏色,大小等。
如果導航的圖示是自己設計的圖示,這時僅僅通過BottomNavigationBar是無法實現我們想要的效果的,比如微信的導航的效果,雖然選中和未選中也是顏色的區別,但圖示不是Icons自帶的圖示,想要實現切換2個圖示需要BottomNavigationBarItem
控制元件的支援,其中的icon
和activeIcon
分別代表未選中和選中。
通過切換導航而改變頁面是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個導航的頁面,背景分別是紅、藍、黃色,效果如下:
推薦幾款Github上帶動畫效果的底部導航
Fluid Button Bar
Icon Flip Button Bar
fancy_bottom_navigation
circular_bottom_navigation
bottom_navy_bar
titled_navigation_bar
更多相關閱讀:
- Flutter系列文章總覽
- Flutter Widgets 之 Expanded和Flexible
- Flutter Widgets 之 AnimatedList
- Flutter Widgets 之 SliverAppBar
如果這篇文章有幫助到您,希望您來個“贊”並關注我的公眾號,非常謝謝。