文章目錄html
相關文章git
Flutter 環境搭建以及填坑指南(Win10 系統且已有 Android 開發環境 )github
Flutter 入門實現 ListView 列表頁面以及收藏頁面bash
實現效果截圖 ui
Flutter
提供了一整套的 Material Design
組件供咱們使用 地址是:Material Components Widgetsspa
而底部導航欄,咱們這裏使用的就是 Material Design
組件中的 BottomNavigationBar
組件 文檔地址是:BottomNavigationBar 官方文檔.net
先定義好要使用的數據:tab
對應的圖標和問題,以及頁面。 僞代碼以下:code
void _initData() {
/*
* 初始化選中和未選中的icon
*/
tabImages = [
[
getTabImage('images/bar_home_unselected.png'),
getTabImage('images/bar_home_selected.png')
],
[
getTabImage('images/bar_publish_unselected.png'),
getTabImage('images/bar_publish_selected.png')
],
[
getTabImage('images/bar_me_unselected.png'),
getTabImage('images/bar_me_selected.png')
]
];
/*
* 三個子界面
*/
_pageList = [
new HomePage(),
new FunctionPage(),
new MinePage(),
];
}
複製代碼
ps: 每一個頁面建立可查看文末的源碼
能夠先看官方文檔中給的例子,也能夠查看我這裏實現的例子,僞代碼以下:
_initData();
return Scaffold(
// 內容
body: _pageList[_tabIndex],
// 導航欄
bottomNavigationBar: new BottomNavigationBar(
items: <BottomNavigationBarItem>[
new BottomNavigationBarItem(
icon: getTabIcon(0), title: getTabTitle(0)),
new BottomNavigationBarItem(
icon: getTabIcon(1), title: getTabTitle(1)),
new BottomNavigationBarItem(
icon: getTabIcon(2), title: getTabTitle(2)),
],
// 點擊 item 會有淡入淡出效果
type: BottomNavigationBarType.shifting,
//默認選中首頁
currentIndex: _tabIndex,
// 圖標大小
iconSize: 24.0,
// 點擊事件
onTap: _onItemTapped,
),
);
複製代碼
Scaffold Widget
提供了基本的 Material Design
佈局因此咱們直接 return new Scaffold
組件。
body: _pageList[_tabIndex] body
每一個 tab
組件顯示的內容,這裏經過一個集合來裝載tab
對應的頁面,而後經過點擊獲取到 _tabIndex
索引,最後再去集合中索引出對應的頁面。
bottomNavigationBar 底部tab
欄,items
集合存放的就是每一個tab item
。而BottomNavigationBarItem
就是具體tab
顯示的圖片和文字信息。type
表示底部導航欄的樣式,這裏有兩個值,一個是shifting
,也就是截圖中的效果,另外一個是fixed
,就是常規的底部導航欄。onTap: _onItemTapped
表示點擊後的操做。
ps:方法前加_
表示方法是私有的
_onItemTapped
的僞代碼以下:
void _onItemTapped(int index) {
setState(() {
_tabIndex = index;
});
}
複製代碼
主要就是刷新了_tabIndex
的值,使body: _pageList[_tabIndex]
可以刷新到對應的頁面。
實現的僞代碼以下:
// 初始化數據
_initData();
return Scaffold(
key: _globalKey,
// 側邊欄
drawer: new Drawer(
child: ListView(
// 去除頂部灰色條
padding: EdgeInsets.zero,
children: <Widget>[
userHeader,
ListTile(
title: Text("註冊登陸"),
leading: Icon(Icons.favorite),
onTap: () => _onPageOpen(context, "註冊登陸"),
),
ListTile(
title: Text("設置"),
leading: Icon(Icons.settings),
onTap: () => _onPageOpen(context, "設置"),
),
],
),
),
// 內容
body: _pageList[_tabIndex],
// 導航欄
bottomNavigationBar: new BottomNavigationBar(),
);
複製代碼
側邊欄頂部padding: EdgeInsets.zero,
便可去掉頂部灰色條條。
側邊欄的打開方式有兩種:
Scaffold
組件下的drawer
裏邊經過點擊事件調用Scaffold.of(context).openDrawer();
複製代碼
key
,例如咱們本例中實現的。 因爲是全局的側邊欄可打開,所以咱們在MainPage.dart
文件中聲明全局對的key
,而後經過構造方法傳參的方式將key
傳遞給HomePage.dart
頁面,那麼這時候點擊HomePage.dart
頁面左上角的圖標的時候就能夠經過下面的代碼來打開側邊欄了leading: Builder(builder: (context) {
return IconButton(
icon: Icon(Icons.menu), //自定義圖標
onPressed: () {
// 打開抽屜菜單
_globalKey.currentState.openDrawer();
},
);
複製代碼
側邊欄關閉可經過點擊事件調用
Navigator.pop(context); // 關閉側邊欄
複製代碼
更多側邊欄相關內容可查看這篇博客 Flutter之drawer詳細分析(你要的操做都有)
若是對你有幫助,請幫忙點個
star
,謝謝~
若有錯誤歡迎指出,共同進步。 源碼地址:FlutterTest