Flutter學習筆記(15)--MaterialApp應用組件及routes路由詳解

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

今天給大家講一下MaterialApp應用組件及routes路由詳解,我會著重說一下routes路由的使用及解釋,因為會經常用到,前面我寫的一些demo所涉及到的組件,都是遵循著Material Design設計風格,所謂的Material Design是由Goodle推出的全新的設計語言,這種設計... ...


如需轉載,請註明出處:Flutter學習筆記(15)--MaterialApp應用組件及routes路由詳解

最近一段時間生病了,整天往醫院跑,也沒狀態學東西了,現在是好了不少了,也該繼續學習啦!!!

今天給大家講一下MaterialApp應用組件及routes路由詳解,我會著重說一下routes路由的使用及解釋,因為會經常用到,前面我寫的一些demo所涉及到的組件,都是遵循著Material Design設計風格,所謂的Material Design是由Goodle推出的全新的設計語言,這種設計旨在為手機、平板電腦、台式機和其他平臺更一致、更廣泛的外觀和感覺,接下來我們看一下常見的Material Design風格組件:

Material Design風格組件說明
組件名稱 中文名稱 簡單說明
Appbar 應用按鈕組件 應用的工具按鈕
AlertDialog 對話框組件 有操作按鈕的對話框
BottomNavigationBar 底部導航組件 底部導航條,可以很容易的在tab之間切換和瀏覽頂級試圖
Card 卡片組件 帶有邊框陰影的卡片組件
Drawer 抽屜組件 Drawer抽屜組件可以實現類似抽屜拉開關閉的效果
FloatingActionButton 懸浮按鈕組件 應用的主要功能操作按鈕
FlatButton 扁平按鈕組件 扁平化風格的按鈕
MaterialApp Material應用組件 MaterialApp代表使用紙墨設計風格的應用
PopupMenuButton 彈出菜單組件 彈出菜單按鈕
Scaffold 腳手架組件 實現了基本的Material Design佈局
SnackBar 輕量提示組件 一個輕量消息提示組件,在屏幕的底部顯示
SimpileDialog 簡單對話框組件 簡單對話框組件。只起提示作用,沒有交互
TabBar 水平選項卡及視圖組件 一個顯示水平選項卡的Material Design組件
TextField 文本框組件 可以接受應用輸入文本的組件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Material Design風格的組件有這麼多,不看不知道,一看嚇一跳,這基本上都沒有用過呀,漫漫長征路,還有很遠要走呀,一個一個學吧!!!

  • MaterialApp(應用組件)

MaterialApp組件屬性及描述
屬性名 類型 說明
title String 應用程式的標題,該標題出現在如下位置Android:任務管理器的程式快照之上,iOS:程式切換管理器中
theme ThemeData 定義應用所使用的主題顏色,可以制定一個主題中每個控制項的顏色
color Color 應用的主要顏色值,即primary color
home Widget 這個是一個Widget對象,用來定義一個主題中每個控制項的顏色
routes Map<String,WidgetBuilder> 定義應用中頁面跳轉的原則
initialRoute String 初始化路由
onGenerateRoute RouteFactory 路由回調函數,當通過Nacigator.of(context).pushNamed跳轉路由時,在routes查找不到時,會調用該方法
onLocaleChanged   當系統需改語言的時候,會觸發這個回調
nagavitorObserver List<NavigatorObserver> 導航觀察器
debugShowMaterialGird bool 是否顯示紙墨設計基礎佈局網格,用來調試UI的工具
showPerformanceOverlay bool 顯示性能標簽

 

 

具體看下代碼應用:

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

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

class DemoApp extends StatelessWidget{
  //這個是整個應用的主組件
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new MaterialApp(
      title: 'MaterialApp示例',
      debugShowMaterialGrid: true,
      showPerformanceOverlay: true,
      theme: new ThemeData(
        primaryColor: Colors.deepOrange
      ),
      home: new MaterialAppDemo(),
    );
  }
}

class MaterialAppDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: Text('MaterialAppDemo'),
      ),
      body: new Center(
        child: new Text('MaterialAppDemo'),
      ),
    );
  }
}

 

效果圖:

                       

demo裡面我主要嘗試了title、theme、home、debugShowMaterialGird、showPerformanceOverlay屬性,根據截圖,給大家直觀的對比一下結果:

title:應用程式的標題(因為我只有Android測試機),可以看到第二張截圖,切到任務管理器,應用程式的標題為MaterialApp示例

theme:我用theme更改了應用主題的顏色,可以看到第一張截圖導航欄的顏色改為了橙色。

home:home代表著整個頁面的主widget,可以理解為根widget,而home的主體就是一個Center容器組件,然後裡面放一個文本。

debugShowMaterialGird:這個屬性我們設置為了true,頁面展示出來會有很多網格,用於調試UI(這個要怎麼用來調試UI,小弟還不會。。。)

showPerformanceOverlay:性能標簽,這個設置為true,在頁面的最上方會出現一些性能相關的數據。

  • routes(路由處理)

routes對象是一個Map<String,WidgetBuilder>,當使用Navigator.pushName來路由的時候,會在routes查找路由的名字,然後使用對應的WidgetBuilder來構造一個帶有頁面切換動畫的MaterialPageRoute

下麵我著重講一下routes路由處理,因為我覺得頁面間的跳轉是最常用到的,而且很重要,下麵的demo主要功能是在A頁面點擊一個按鈕跳轉到B頁面,並且兩個頁面間傳值。

註:路由跳轉分靜態路由跳轉和動態路由跳轉,兩者的區別就是是否給第二個頁面傳值

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

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

class DemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new MaterialApp(
      title: 'theme Title',
      debugShowMaterialGrid: false,
      home: new Scaffold(
        appBar: new AppBar(
          leading: Icon(Icons.menu),
          actions: <Widget>[
            Icon(Icons.search)
          ],
          title: new Text('routes demo'),
        ),
        body: new Center(
          child: new Text('主頁'),
        ),
      ),
      routes: {
        '/first':(BuildContext context) => new FirstPage(),
        '/second':(BuildContext context) => new SecondPage(""),
      },
      initialRoute: '/first',//初始化路由為first頁面
    );
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('First Page'),
      ),
      body: new Center(
        child: RaisedButton(
          child: new Text('第一個頁面'),
            onPressed: (){
                //靜態路由跳轉,不給第二個頁面傳值
//              Navigator.pushNamed(context, '/second').then((value){
//                Fluttertoast.showToast(msg: value,toastLength: Toast.LENGTH_LONG,gravity: ToastGravity.BOTTOM);
//              });
              //動態路由跳轉,給第二個頁面傳值
              Navigator.of(context).push(new MaterialPageRoute(builder: (context){
                return new SecondPage('這是從第一個頁面傳遞出去的數據');
              })).then((value){
                Fluttertoast.showToast(msg: value,toastLength: Toast.LENGTH_LONG,gravity: ToastGravity.BOTTOM);
              });
            }
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  var content = '';
  SecondPage(this.content);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Second Page'),
      ),
      body: new RaisedButton(
        child: new Text(content),
          onPressed: (){
//            Navigator.pop(context);//不給上一級頁面返回參數
            Navigator.of(context).pop("這個是從第二個頁面返回的數據");//給上一級頁面返回參數
          }
      ),
    );
  }
}

 

效果截圖:

     

來細講一下上面的代碼吧,要不然還真容易看懵逼了。

1.首先初始化路由列表,為後面頁面跳轉做準備,路由列表對應這每一個頁面

routes: {
        '/first':(BuildContext context) => new FirstPage(),
        '/second':(BuildContext context) => new SecondPage(""),
      },

 

2.靜態路由跳轉,靜態由A頁面跳轉到B頁面,不給B頁面傳值,但是接收B頁面返回的數據,並將返回值toast出來,即圖3

Navigator.pushNamed(context, '/second').then((value){
                Fluttertoast.showToast(msg: value,toastLength: Toast.LENGTH_LONG,gravity: ToastGravity.BOTTOM);
              });

 

3.動態路由跳轉,A頁面跳轉到B頁面,並給B頁面傳值,將B頁面的按鈕文案賦值,從B頁面返回後,將B頁面的返回值toast出來,即圖2,圖3

Navigator.of(context).push(new MaterialPageRoute(builder: (context){
                return new SecondPage('這是從第一個頁面傳遞出去的數據');
              })).then((value){
                Fluttertoast.showToast(msg: value,toastLength: Toast.LENGTH_LONG,gravity: ToastGravity.BOTTOM);
              });

 

4.由B頁面帶數據返回到A頁面(頁面Pop返回有兩類,一類帶參數返回,一類不帶參數返回)

4.1帶參數返回

Navigator.of(context).pop("這個是從第二個頁面返回的數據");//給上一級頁面返回參數

 

4.2不帶參數返回

Navigator.pop(context);//不給上一級頁面返回參數

 

註:頁面Pop還有兩個方法常用到

Navigator.canPop(context);//頁面是否可以pop,返回bool值,可以用作頁面判斷
Navigator.maybePop(context);//如果當前頁面可以pop,則會執行,反之則不會執行,更安全

 

以上就是今天的全部內容了,稍微難一點的就是路由這塊兒了,我寫的demo還是很簡單的,頁面跳轉傳值只是字元串,在項目中還會遇到其他類型的數據參數,暫時就先不研究了,等用到的時候在具體細看吧,上面的內容,如果各位有任何疑問,或者發現有錯誤的地方,還望留言!!!

 


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

-Advertisement-
Play Games
更多相關文章
  • 對於所有的需求,當你不知道怎麼處理的時候,你就先用最簡單的方法,或者說的明白一點,用最原始的方法,先實現業務需求再說。 一、對提現隊列數據表“ims_checkout_task”進行彙總統計,按月彙總統計每個月的提現總額,提現總次數。 1、SQL操作如下: 2、資料庫返回如下: 3、關鍵詞:case ...
  • 【發現問題】 【問題分析】 Ⅰ、在前端界面查詢,發現了庫存中存在這樣的數量值。但是在資料庫中查詢時顯示正常。即6.999999999999997 為 7。 Ⅱ、至於這種小數產生,我以為是oracle存儲過程計算的時候也會失真?後來發現我這是由於其他問題造成的。 🌂對於前端和資料庫的查詢結果不一致, ...
  • 二、主從搭建 2.1測試目標 測試postgresql主從搭建安裝過程 2.2環境準備 實例級別的複製 流複製主庫可讀寫,但從庫只允許查詢不允許寫人, 而邏輯複製的從庫可讀寫 流複製實驗環境 主機 主機名 Ip地址 操作系統 Postgresql版本 主節點 pgsql 192.168.231.13 ...
  • ...
  • 1 大數據概述大數據特性:4v volume velocity variety value 即大量化、快速化、多樣化、價值密度低 數據量大:大數據摩爾定律 快速化:從數據的生成到消耗,時間視窗小,可用於生成決策的時間非常少;1秒定律,這和傳統的數據挖掘技術有著本質區別(谷歌的dremel可以在1秒內... ...
  • 前面配置了ACFS用於ogg目錄。 上傳軟體並解壓安裝: unzip 123014_fbo_ggs_Linux_x64_shiphome.zip cd fbo_ggs_Linux_x64_shiphome/cd Disk1/./runInstaller 添加環境變數 su - oracle cat ...
  • [學習筆記] collect: 收集一個彈性分散式數據集的所有元素到一個數組中,這樣便於我們觀察,畢竟分散式數據集比較抽象。Spark的collect方法,是Action類型的一個運算元,會從遠程集群拉取數據到driver端。最後,將大量數據 彙集到一個driver節點上,將數據用數組存放,占用了jv ...
  • 前言 開心一刻 一個中國小孩參加國外的脫口秀節目,因為語言不通,於是找了一個翻譯。 主持人問:“Who is your favorite singer ?” 翻譯:”你最喜歡哪個歌手啊 ?” 小孩興奮地回答:”Michael Jackson” 翻譯轉身對主持人說:”邁克爾-傑克遜” 主持人看著翻譯: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...