1. 程式人生 > >Flutter學習筆記(15)--MaterialApp應用元件及routes路由詳解

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

如需轉載,請註明出處: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路由處理,因為我覺得頁面間的跳轉是最常用到的,而且很重要,下面的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還是很簡單的,頁面跳轉傳值只是字串,在專案中還會遇到其他型別的資料引數,暫時就先不研究了,等用到的時候在具體細看吧,上面的內容,如果各位有任何疑問,或者發現有錯誤的地方,還望留言!!!

&n