Flutter學習筆記(16)--Scaffold腳手架、AppBar組件、BottomNavigationBar組件

来源:https://www.cnblogs.com/upwgh/archive/2019/08/16/11361402.html
-Advertisement-
Play Games

今天的內容是Scaffold腳手架、AppBar組件、BottomNavigationBar組件,通過這三個組件,能大體構建出一個app的主頁面,頂導和底導。 ...


如需轉載,請註明出處:Flutter學習筆記(16)--Scaffold腳手架、AppBar組件、BottomNavigationBar組件

今天的內容是Scaffold腳手架、AppBar組件、BottomNavigationBar組件,通過這三個組件,能大體構建出一個app的主頁面,頂導和底導。

  • Scaffold(腳手架組件)

Scaffold實現了基本的Material Design佈局,只要是在Material Design中定義過的單個界面顯示的佈局控制項元素,都可以使用Scaffold來繪製。

Scaffold組件屬性及描述
屬性名 類型 說明
appbar AppBar 顯示在界面頂部的一個AppBar
body Widget 當前界面所顯示的主要內容
floatingActionButton Widget 在Material Design中定義的一個功能按鈕
persistentFooterButtons List<Widget> 固定在下方展示的按鈕
drawer Widget 側邊欄組件
bottomNavigationBar Widget 顯示在底部的導航欄按鈕
backgroundColor Color 背景顏色
resizeToAvoidBottomPadding bool 控制界面內容body是否重新佈局來避免底部被覆蓋,比如當鍵盤顯示時,重新佈局避免鍵盤遮蓋住內容,預設值為true

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Demo示例:

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

void main() => runApp(DemoApp());

class DemoApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Scaffold Demo',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Scaffold Demo'),
        ),
        body: new Center(
          child: new Text('Scaffold Dmoe 腳手架組件'),
        ),
        //底部導航按鈕
        bottomNavigationBar: new BottomAppBar(
          child: new Container(width: 100,height: 100,),
        ),
        backgroundColor: Colors.deepOrange,
      ),
    );
  }
}

效果截圖:

  • AppBar(導航)

應用中的頂部導航有兩種,一種AppBar一種SilveApprBar,這兩種對應Android中的toolbar,AppBar和SliveApprBar都是繼承自StatefulWidget,這兩者的區別是AppBar是固定在應用的最上面,就是頁面的最頂部,而SliveApprBar是可以跟隨內容滾動的。

AppBar及SliverAppBar組件屬性及描述
屬性名 類型 預設值 說明
leading Widget null 在標題前面顯示的一個組件,一般情況下展示按鈕,比如返回按鈕
title Widget null 通常顯示為當前頁面的標題名
actions List<Widget> null 一個Widget列表,一般情況下展示的也是按鈕,比如搜索按鈕等
bottom PreferredSizeWidget null 通常是TabBar,用來在ToolBar標題欄下麵顯示一個Tab導航欄
elevation double 4 紙墨設計中組件的z坐標順序,對於可滾動的SliverBar,當SliverBar和內容同級的時候,該值為0,當內容滾動SliverAppBar變為toolbar的時候,修改為elevation的值
flexibleSpace Widget null 一個顯示在AppBar下方的組件,高度和AppBar的高度一樣,可以實現一些特殊的效果,該屬性通常在SliverAppBar中使用
backgroundcolor Color ThemeData.primaryColor 背景色
brightness Brightness ThemeData.primaryColorBrightness AppBar的亮度,有白色和黑色兩種主題
iconTheme IconThemeData ThemeData.primaryIconTheme AppBar上圖標的顏色、透明度和尺寸信息
textTheme TextTheme ThemeData.primaryTextTheme AppBar上的文字樣式
centerTitle bool true 標題顯示是否居中,預設值根據不同的操作系統,顯示的方式不一樣

 

示例代碼:

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

void main() => runApp(DemoApp());

class DemoApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      debugShowMaterialGrid: false,
      debugShowCheckedModeBanner: false,
      title: 'AppBar Demo',
      home: new Scaffold(
        appBar: new AppBar(
          backgroundColor: Colors.cyanAccent,//標題欄北京設置為淺藍色
          leading: Icon(Icons.menu),//標題左側按鈕
          iconTheme: IconThemeData(color: Colors.amberAccent,opacity: 30,size: 25),//icon的主題,會作用到AppBar上的所有Icon(不包含IconButton,因為IconButton是個button)
          title: new Text('AppBar Demo',style: TextStyle(color: Colors.deepPurple,fontSize: 20),),//標題文案及字體樣式設置
          actions: <Widget>[
            IconButton(icon: Icon(Icons.search),tooltip: '搜索', onPressed: null),//標題右側按鈕
            IconButton(icon: Icon(Icons.add),tooltip: '添加', onPressed: null)//標題右側按鈕
          ],
        ),
      ),
    );
  }

}

 

這些東西在前面的Demo都用過很多次了,就不多加說明瞭,看下效果截圖:

  • BottomNavigationBar(底部導航條組件)

BottomNaviationBar是底部導航條,主要由按鈕加文字組成,按下按鈕切換不同的頁面,需要一個當前的索引來控制當前具體切換的頁面,可以很容易的在tab之間切換和瀏覽頂級試圖,很多App主頁底部都採用這種切換的方式。

BottomNavigationBar組件屬性及描述
屬性名 類型 說明
currentIndex int 當前索引,用來切換按鈕控制
fixedColor Color 選中按鈕的顏色,如果沒有指定值,則用系統主題色
iconSize double 按鈕圖標大小
items List<BottomNavigationBarItem> 底部導航條按鈕集,每一項是一個BottomNavigationBarItem,由icon圖標及title文本屬性
onTap ValueChanged<int> 按下其中某一個按鈕回調事件,需要根據返回的索引設置當前索引

 

 

 

 

 

 

 

 

 

 

寫一個簡單的demo,底部導航放置3個選項卡,每點擊一個選項卡,屏幕中間的文案隨之變化,先看下代碼和結果,然後講一下代碼的內容。

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

void main() => runApp(DemoApp());

class DemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'BottomNavigationBar Demo',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('BottomNavigationBar Demo'),
          leading: Icon(Icons.menu),
          actions: <Widget>[
            IconButton(icon: Icon(Icons.search), onPressed: null)
          ],
        ),
        body: MyHomePage(),
      ),
    );
  }
}

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

class _MyHomePageState extends State {
  var _selectedIndex = 0;
  var _selectedText = [
    new Text('相機'),
    new Text('掃碼'),
    new Text('鬧鐘'),
  ];
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Center(
        child: _selectedText.elementAt(_selectedIndex),
      ),
      bottomNavigationBar: new BottomNavigationBar(
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(icon: Icon(Icons.add_a_photo),title: new Text('相機')),
          BottomNavigationBarItem(icon: Icon(Icons.center_focus_weak),title: new Text('掃碼')),
          BottomNavigationBarItem(icon: Icon(Icons.add_alarm),title: new Text('鬧鐘')),
        ],
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
        fixedColor: Colors.amberAccent,
      ),
    );
  }

  void _onItemTapped(int value) {
    setState(() {
      _selectedIndex = value;
    });
  }
}

 

首先要清楚的一點,有狀態變化,所以要用StatefulWidget有狀態組件,其次要想屏幕中間的文案和底部導航按鈕要隨點擊事件的觸發而變化,必然要有初始的索引值和文案的組件數組

  var _selectedIndex = 0;
  var _selectedText = [
    new Text('相機'),
    new Text('掃碼'),
    new Text('鬧鐘'),
  ];

 

這裡的_selectedText數組裡面裝的是3個Text組件,每次點擊底部導航的按鈕,都會根據索引值將這3個Text分別放進child裡面,接下來就行處理我們的bottomNavigationBar,上面的BottomNavigationBar屬性表裡面說過所有的選項卡都是放在items集合裡面的,currentIndex處理點擊後當前選項的索引值,onTap處理點擊事件,fixedColor處理點擊選項卡的顏色(包含按鈕及文本的顏色)

bottomNavigationBar: new BottomNavigationBar(
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(icon: Icon(Icons.add_a_photo),title: new Text('相機')),
          BottomNavigationBarItem(icon: Icon(Icons.center_focus_weak),title: new Text('掃碼')),
          BottomNavigationBarItem(icon: Icon(Icons.add_alarm),title: new Text('鬧鐘')),
        ],
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
        fixedColor: Colors.amberAccent,
      ),

 

最後看一下事件的處理_onItemTapped,其實很簡單,就是更新bottomNavigationBar的索引值,並且通過setState通知頁面重新繪製,最終呈現出我們想要的效果。

 

好啦,今天就先學這麼多!該睡覺啦

 

下一章節:Flutter學習筆記(17)--頂部導航TabBar、TabBarView、DefaultTabController


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GridView中使用最多的一個是BoundField,還有一個是TemplateField 這兩個各有其特點,BoundField的話比較簡單,設置好DataField、HeaderText等就okay了。但是有時候用TemplateField 的話,交互性就更多了。 這次的項目中,對方要我們做二 ...
  • .NETCoreCSharp 中級篇2 4 本節內容為正則表達式的使用 簡介 有的時候,你是否有過這種需求:判斷一個Ip地址、郵箱、密碼規則是否合法。如果讓你使用if一類的傳統方法進行處理,你肯定會被逼瘋的。而對於絕大多數的編程語言而言,都有一個字元串處理利器————正則表達式。它可以輕鬆的讓字元串 ...
  • 操作步驟: 1.創建DataTable; 2.將數據源p[i,j]導入DataTable; 3.打開資料庫連接; 4.簡歷 DataTable 與 資料庫數據表 的列映射關係; 5.將數據寫入數據表; 6.關閉資料庫連接。 該過程中,DataTable是數據的中轉站。 即:數據源 ==>DataTa ...
  • C#連接資料庫的類 使用方法: public SqlConnection OpenConn() { //創建連接 SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(); scsb.DataSource = "127.0. ...
  • 結構是一種可以包含數據成員和方法成員的值類型數據結構。為結構分配數據時不需要從托管堆中分配記憶體,結構類型的變數直接包含了該結構的數據。結構中可以包含構造函數,常量,欄位方法,屬性,運算符,事件和嵌套類型等,但如果要同事包括上述幾種成員,則應該考慮使用類。 結構是一種可以包含數據成員和方法成員的值類型 ...
  • 使用CefSharp可以在.NET輕鬆的嵌入Html,不用擔心WPF與Winform 控制項與它的相容性問題,CefSharp大部分的代碼是C#,它可以在VB或者其他.NET平臺語言中來進行使用。 近幾天來,公司項目中需要使用WebBrowser,其中考慮了幾個控制項,如1.Winform中的WebBr ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/2967/ 今年畢業,本學期找工作期間在面試前做的一些臨時的準備 以下的關於老趙分享的面試題解答參考了手頭的書籍和視頻教程,以及網上的資料,現整理出來希望對大家有所幫助,不對或欠佳的地方望大家指出來我好改 ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/2184/ 1.維護資料庫的完整性、一致性、你喜歡用觸發器還是自寫業務邏輯?為什麼? 答:儘可能用約束(包括CHECK、主鍵、唯一鍵、外鍵、非空欄位)實現,這種方式的效率最好;其次用觸發器,這種方式可以保 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...