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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...