亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Flutter實現底部菜單導航

2019-10-21 21:25:30
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了Flutter實現底部菜單導航,具有一定的參考價值,感興趣的小伙伴們可以參考一下
 

簡介

現在我們的 APP 上面都會在屏幕下方有一排的按鈕,點擊不同的按鈕可以進入不同的界面。就是說在界面的底部會有一排的按鈕導航??煽聪旅娴膱D示。

完成圖示

Flutter,底部菜單導航

程序工程目錄

Flutter,底部菜單導航

梳理下實現步驟

我們需要實現這個底部菜單導航,就需要有底部菜單的那一排圖標按鈕。圖標按鈕是固定在一個工具欄 “bar” 上面。然后呢,需要分別需要有按鈕對應的界面,就是說按鈕有多少個,那么界面需要對應的有多少個。我們來一個清單列表:

  • 按鈕圖標區域。由于展示的方式都是一樣的,我們需要有一個單獨的控件,循環出來就好。
  • 工具欄區域。用于展示按鈕圖標,并且能固定在底部。
  • 首頁。用于將工具欄放入界面中,并且將按鈕對應的界面作為它的子元素存放于其中。
  • 不同的按鈕對應的界面。在我們點擊的圖標按鈕的時候,展示不同的界面。

我們底部的按鈕是不會刷新的,界面會刷新,如何實現?

我們界面展示區域分為兩塊,一塊展示底部的工具欄,一塊展示頁面。下面代碼實現:

return new MaterialApp(  home: new Scaffold(   body: new Center(    child: _currentPage // 動態的展示我們當前的頁面   ),   bottomNavigationBar: bottomNavigationBar, // 底部工具欄  ),  theme: new ThemeData(  primarySwatch: Colors.blue, // 設置主題顏色  ), );

具體實現

第一步:創建一個 flutter 工程 
可以按照工程目錄圖中的結構,將對應的文件建好。

第二步:修改 main.dart。 
main.dart 是我們程序的入口。就類似于 Java、C 中的 main() ,作為一個程序的入口。我們將 main.dart 作為程序的啟動入口,就不做過多的操作,只是指定去加載我們的首頁(index.dart)。

main.dart

import 'package:flutter/material.dart';import 'package:flutter_demo/index/index.dart';   // 導入index.dart// 這里為入口函數void main() => runApp(new MyApp());class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp(  title: 'Flutter Demo',  home: new Index(),  // 指定去加載 Index頁面。 ); }}

第三步:創建 NavigationIconView。 
正如前面說的,我們底部的按鈕區域展示的圖標加上文字是固定格式,所以將這一部分抽取出來,作為一個公共的 class,方便界面程序維護。

navigation_icon_view.dart

import 'package:flutter/material.dart';// 創建一個 Icon 展示控件class NavigationIconView { // 創建兩個屬性,一個是 用來展示 icon, 一個是動畫處理 final BottomNavigationBarItem item; final AnimationController controller; // 類似于 java 中的構造方法 // 創建 NavigationIconView 需要傳入三個參數, icon 圖標,title 標題, TickerProvider NavigationIconView({Widget icon, Widget title, TickerProvider vsync}): item = new BottomNavigationBarItem(  icon: icon,  title: title, ), controller = new AnimationController(  duration: kThemeAnimationDuration, // 設置動畫持續的時間  vsync: vsync       // 默認屬性和參數 );}

第四步:創建 Index

這一步就比較重要了,因為我們需要在這個界面上面去布局,以及實現點擊按鈕圖標之后,有事件觸發。正因為我們需要有事件觸發,所以創建一個帶有狀態的 Widget(StatefulWidget)。下面的代碼注釋給的很詳細了,可以仔細看。

index.dart

import 'package:flutter/material.dart';import 'package:flutter_demo/NoticePage/notice_page.dart';import 'package:flutter_demo/home/home_page.dart';import 'package:flutter_demo/idea/idea_page.dart';import 'package:flutter_demo/market/market_page.dart';import 'package:flutter_demo/my/my_page.dart';import 'navigation_icon_view.dart'; // 如果是在同一個包的路徑下,可以直接使用對應的文件名// 創建一個 帶有狀態的 Widget Indexclass Index extends StatefulWidget { // 固定的寫法 @override State<StatefulWidget> createState() => new _IndexState();}// 要讓主頁面 Index 支持動效,要在它的定義中附加mixin類型的對象TickerProviderStateMixinclass _IndexState extends State<Index> with TickerProviderStateMixin{ int _currentIndex = 0; // 當前界面的索引值 List<NavigationIconView> _navigationViews; // 底部圖標按鈕區域 List<StatefulWidget> _pageList; // 用來存放我們的圖標對應的頁面 StatefulWidget _currentPage; // 當前的顯示頁面 // 定義一個空的設置狀態值的方法 void _rebuild() { setState((){}); } @override void initState() { super.initState(); // 初始化導航圖標 _navigationViews = <NavigationIconView>[  new NavigationIconView(icon: new Icon(Icons.assessment), title: new Text("首頁"), vsync: this), // vsync 默認屬性和參數  new NavigationIconView(icon: new Icon(Icons.all_inclusive), title: new Text("想法"), vsync: this),  new NavigationIconView(icon: new Icon(Icons.add_shopping_cart), title: new Text("市場"), vsync: this),  new NavigationIconView(icon: new Icon(Icons.add_alert), title: new Text("通知"), vsync: this),  new NavigationIconView(icon: new Icon(Icons.perm_identity), title: new Text("我的"), vsync: this), ]; // 給每一個按鈕區域加上監聽 for (NavigationIconView view in _navigationViews) {  view.controller.addListener(_rebuild); } // 將我們 bottomBar 上面的按鈕圖標對應的頁面存放起來,方便我們在點擊的時候 _pageList = <StatefulWidget>[  new HomePage(),  new IdeaPage(),  new MarketPage(),  new NoticePage(),  new MyPage() ]; _currentPage = _pageList[_currentIndex]; } @override Widget build(BuildContext context) { // 聲明定義一個 底部導航的工具欄 final BottomNavigationBar bottomNavigationBar = new BottomNavigationBar(  items: _navigationViews   .map((NavigationIconView navigationIconView) => navigationIconView.item)   .toList(), // 添加 icon 按鈕  currentIndex: _currentIndex, // 當前點擊的索引值  type: BottomNavigationBarType.fixed, // 設置底部導航工具欄的類型:fixed 固定  onTap: (int index){ // 添加點擊事件  setState((){ // 點擊之后,需要觸發的邏輯事件   _navigationViews[_currentIndex].controller.reverse();   _currentIndex = index;   _navigationViews[_currentIndex].controller.forward();   _currentPage = _pageList[_currentIndex];  });  }, ); return new MaterialApp(  home: new Scaffold(   body: new Center(    child: _currentPage // 動態的展示我們當前的頁面   ),   bottomNavigationBar: bottomNavigationBar, // 底部工具欄  ),  theme: new ThemeData(  primarySwatch: Colors.blue, // 設置主題顏色  ), ); }}

第四步:創建頁面

前面的步驟都是在搭建我們的基礎,現在是做展示界面。由于不同的界面,對應的源碼都是和下面的是一樣的,只是 class 的名字不一樣,就都可以使用同樣的模版復制過去就有可以了。

home_page.dart

import 'package:flutter/material.dart';class HomePage extends StatefulWidget{ @override State<StatefulWidget> createState() => new _HomePageState();}class _HomePageState extends State<HomePage> { @override Widget build(BuildContext context) { return new MaterialApp(  home: new Scaffold(  appBar: new AppBar(   title: new Text('首頁'),   actions: <Widget>[   new Container()   ],  ),  body: new Center(   child: null,  ),  ), ); }}

idea_page.dart

import 'package:flutter/material.dart';class IdeaPage extends StatefulWidget{ @override State<StatefulWidget> createState() => new _IdeaPageState();}class _IdeaPageState extends State<IdeaPage> { @override Widget build(BuildContext context) { return new MaterialApp(  home: new Scaffold(  appBar: new AppBar(   title: new Text('想法'),   actions: <Widget>[   new Container()   ],  ),  body: new Center(   child: null,  ),  ), ); }}

market_page.dart

import 'package:flutter/material.dart';class MarketPage extends StatefulWidget{ @override State<StatefulWidget> createState() => new _MarketPageState();}class _MarketPageState extends State<MarketPage> { @override Widget build(BuildContext context) { return new MaterialApp(  home: new Scaffold(  appBar: new AppBar(   title: new Text('市場'),   // 后面的省略   // ......  )  ), ); }}

剩下的界面都是一樣子的了,就不貼出來了,都是復制一下,改了一個類名,和顯示的文字而已。

第五步:啟動測試

到此我們就完成了,可以啟動程序,看下效果。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。

 


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频欧美视频| 成人乱色短篇合集| 亚洲成人黄色网| 亚洲精品成人网| www国产精品视频| 久久人人爽人人爽人人片亚洲| 久久久综合免费视频| 91精品美女在线| 日韩视频免费大全中文字幕| 国产精品久久在线观看| 色一情一乱一区二区| 精品国产自在精品国产浪潮| 欧美一级片久久久久久久| 欧美国产亚洲精品久久久8v| 色与欲影视天天看综合网| 国产激情久久久久| 日韩一区av在线| 国产精品高潮呻吟久久av野狼| 国产精品高潮视频| 在线精品国产成人综合| 欧美夫妻性视频| 久久久视频免费观看| 中文字幕日韩在线视频| 成人97在线观看视频| 日韩在线资源网| 日韩av在线网站| 国产亚洲视频中文字幕视频| 91在线无精精品一区二区| 久久伊人精品一区二区三区| 国产精品最新在线观看| 大量国产精品视频| 久久久精品久久久| 欧美性xxxxxxx| 色777狠狠综合秋免鲁丝| 亲子乱一区二区三区电影| 国产成人啪精品视频免费网| 久久精品中文字幕免费mv| 日韩精品福利在线| 国产在线精品成人一区二区三区| 琪琪亚洲精品午夜在线| 亚洲精品国产综合区久久久久久久| 中文字幕在线日韩| 日韩av毛片网| 日韩欧美999| 国产精品第七十二页| 51久久精品夜色国产麻豆| 性色av一区二区三区在线观看| 免费91在线视频| 欧美日韩亚洲成人| 国产丝袜一区二区三区免费视频| 中文字幕在线看视频国产欧美| 亚洲色图欧美制服丝袜另类第一页| 亚洲成人av片在线观看| 欧美日韩视频在线| 日韩成人激情影院| 国产欧美va欧美va香蕉在线| 欧美制服第一页| 国产日产久久高清欧美一区| 亚洲人成在线观看网站高清| 深夜福利一区二区| 欧美—级a级欧美特级ar全黄| 搡老女人一区二区三区视频tv| 亚洲成人av资源网| 亚洲自拍偷拍一区| 69视频在线免费观看| 国产精品国产三级国产aⅴ浪潮| 久久久国产精品视频| 亚洲精品自拍第一页| 欧美激情图片区| 成人激情视频免费在线| 欧美日韩在线视频观看| 国内精品国产三级国产在线专| 国产精品爽爽爽爽爽爽在线观看| 91精品久久久久久久久久久久久久| 国产精品黄色av| 伊人激情综合网| 日韩欧美在线视频免费观看| 精品亚洲一区二区三区四区五区| 国产激情999| 欧美大片网站在线观看| 国产精品久久久久高潮| 日本欧美在线视频| 欧美自拍大量在线观看| 成人伊人精品色xxxx视频| 91久久综合亚洲鲁鲁五月天| 欧美—级高清免费播放| 日韩精品福利网站| 欧美xxxx做受欧美| 国产经典一区二区| 欧美激情精品久久久| 欧美俄罗斯乱妇| 激情懂色av一区av二区av| 九九热在线精品视频| 国产成人精品av在线| 91视频九色网站| 亚洲大胆人体在线| 国外成人免费在线播放| 91精品国产精品| 日韩天堂在线视频| 中文字幕日韩av综合精品| 日韩av片电影专区| 中文字幕欧美日韩va免费视频| 亚洲影视九九影院在线观看| 久久久久久久色| 日韩人体视频一二区| 91九色视频导航| 成人免费视频a| 欧美亚洲激情视频| 日韩综合视频在线观看| 中国人与牲禽动交精品| 成人黄色av网| 91精品国产91久久久久| 91人成网站www| 国产成人av网| 国产亚洲欧美视频| www.日韩欧美| 国产成人av在线| 97在线视频精品| 国产精品欧美久久久| 欧美成人精品三级在线观看| 久久精品国产96久久久香蕉| 丝袜亚洲另类欧美重口| 欧美亚洲另类激情另类| 亚洲激情在线观看视频免费| 91高潮在线观看| 国产精品亚洲精品| 国产精品视频区| 亚洲自拍偷拍视频| 亚洲一区二区久久久久久久| 国产精品自拍偷拍视频| 精品国内亚洲在观看18黄| 中文字幕日韩欧美精品在线观看| 精品视频偷偷看在线观看| 久久久99久久精品女同性| 久久精品色欧美aⅴ一区二区| 国产精品精品视频一区二区三区| 亚洲国产精品人久久电影| 亚洲精品自拍第一页| 欧美成人剧情片在线观看| 最新亚洲国产精品| 欧美日韩高清在线观看| 久久人人爽人人爽人人片av高清| 成人精品久久久| 欧美午夜女人视频在线| 日韩电影中文字幕av| 欧美性感美女h网站在线观看免费| 一本色道久久88精品综合| 欧美孕妇孕交黑巨大网站| 精品久久久久久亚洲国产300| 欧美电影在线观看高清| 国产亚洲精品美女久久久久| 欧美激情日韩图片| 欧美特黄级在线| 日韩欧美亚洲范冰冰与中字| 欧美在线激情视频| 国产在线观看一区二区三区| 国内精品久久久久久久久| 欧美日韩精品二区| 欧美体内谢she精2性欧美| 久久久久国产精品www| 97香蕉超级碰碰久久免费的优势| 97成人精品视频在线观看| 欧美另类69精品久久久久9999| 成人性生交大片免费看小说|