flutter布局-6-MaterialApp

示例 github:flutterlayout https://github.com/LiuC520/flutterlayout

MaterialApp

連載:flutter布局-1-column
連載:flutter布局-2-row
連載:flutter布局-3-center
連載:flutter布局-4-container
連載:[flutter布局-5-Matrix4矩陣變換

這個是有狀態(tài)的widget,有以下參數

    this.navigatorKey, // 導航的key
    this.home, // 主頁
    this.routes = const <String, WidgetBuilder>{},// 路由
    this.initialRoute,//初始路由
    this.onGenerateRoute,//生成路由
    this.onUnknownRoute,//位置路由
    this.navigatorObservers = const <NavigatorObserver>[],//導航的觀察者
    this.builder,//widget的構建
    this.title = '',//設備用于識別用戶的應用程序的單行描述。在Android上,標題顯示在任務管理器的應用程序快照上方,當用戶按下“最近的應用程序”按鈕時會顯示這些快照。 在iOS上,無法使用此值。 來自應用程序的`Info.plist`的`CFBundleDisplayName`在任何時候都會被引用,否則就會引用`CFBundleName`。要提供初始化的標題,可以用 onGenerateTitle。
    this.onGenerateTitle,//每次在WidgetsApp構建時都會重新生成
    this.color,//背景顏色
    this.theme,//主題,用ThemeData
    this.locale,//app語言支持
    this.localizationsDelegates,//多語言代理
    this.localeResolutionCallback,//
    this.supportedLocales = const <Locale>[Locale('en', 'US')],//支持的多語言
    this.debugShowMaterialGrid = false,//顯示網格
    this.showPerformanceOverlay = false,//打開性能監(jiān)控,覆蓋在屏幕最上面
    this.checkerboardRasterCacheImages = false,
    this.checkerboardOffscreenLayers = false,
    this.showSemanticsDebugger = false,//打開一個覆蓋圖,顯示框架報告的可訪問性信息 顯示邊框
    this.debugShowCheckedModeBanner = true,//右上角顯示一個debug的圖標

大家可以新建一個項目,在main.dart文件里面就能看到這個東西啦

       * 如果home首頁指定了,routes里面就不能有'/'的根路由了,會報錯,/指定的根路由就多余了
       * 如果沒有home指定具體的頁面,那routes里面就傲有/來指定根路由
       * 路由的順序按照下面的規(guī)則來:
       * 1、如果有home,就會從home進入
       * 2、如果沒有home,有routes,并且routes指定了入口'/',就會從routes的/進入
       * 3、如果上面兩個都沒有,或者路由趙達不到,如果有 onGenerateRoute,就會進入生成的路由
       * 4、如果連上面的生成路由也沒有,就會走到onUnknownRoute,不明所以的路由,比如網絡連接失敗,可以進入斷網的頁面

具體的用法看下下面的代碼

1、home:主頁面

home: Home(),

2、routes:路由

final routes = {
  '/Transform1': (BuildContext context) => new Transform1(),
  '/Scale1': (BuildContext context) => new Scale1(),
  '/Rotation1': (BuildContext context) => new Rotation1(),
  '/': (BuildContext context) => new Home(),
};
...
在build里面
routes: routes,

routes是一個對象,鍵是字符串,值是widgetbuilder,也就是widget
里面包含了頁面的路由頁面配置。

3、initialRoute: '/',初始路由

4、onGenerateRoute: 生成路由

有下面的用法

 onGenerateRoute: (RouteSettings settings) {
        return new MaterialPageRoute<void>(
          settings: settings,
          builder: (BuildContext context) => Text('生成了路由'),
        );
onGenerateRoute: (RouteSettings settings) {
        return new MaterialPageRoute<void>(
          settings: settings,
          builder: (BuildContext context) => MaterialApp(
                // routes: <String, WidgetBuilder>{
                //   '/': (context) => Text('用MaterialApp生成了新的路由')
                // },
                routes: routes,
              ),
        );
      },

5、onUnknownRoute: 未知路由

 onUnknownRoute: (RouteSettings settings) => MaterialPageRoute<void>(
          settings: settings,
          builder: (BuildContext context) => Text('路由找不到了')),

6、navigatorObservers: 導航觀察者

導航路由在跳轉時的回調,比如 push,pop,remove,replace是,可以拿到當前路由和后面路由的信息。
route.settings.name可以拿到路由的名字

      navigatorObservers: <NavigatorObserver>[NewObserver()],
//導航的觀察者
//繼承NavigatorObserver
class NewObserver extends NavigatorObserver {
  @override
  void didPush(Route route, Route previousRoute) {
    // 當調用Navigator.push時回調
    super.didPush(route, previousRoute);
    //可通過route.settings獲取路由相關內容
    print(route.settings);
    print(previousRoute);
  }

  @override
  void didPop(Route route, Route previousRoute) {
    // TODO: implement didPop
    // 當調用Navigator.pop時回調
    super.didPop(route, previousRoute);
    print(route);
    //route.currentResult獲取返回內容
    print(previousRoute);
  }

  @override
  void didRemove(Route route, Route previousRoute) {
    // TODO: implement didRemove
    // 當調用Navigator.Remove時回調
    super.didRemove(route, previousRoute);
    print(route);
    print(previousRoute);
  }

7、builder: widget

這個是直接渲染這個builder,不會走路由,優(yōu)先渲染這個里面的widget

builder: (BuildContext context, Widget w) => Text("生成新的view"),

8、title:任務管理器顯示的標題

設備用于識別用戶的應用程序的單行描述。在Android上,標題顯示在任務管理器的應用程序快照上方,當用戶按下“最近的應用程序”按鈕時會顯示這些快照。 在iOS上,無法使用此值。 來自應用程序的Info.plistCFBundleDisplayName在任何時候都會被引用,否則就會引用CFBundleName。要提供初始化的標題,可以用 onGenerateTitle。

9、onGenerateTitle: 生成任務管理器顯示的標題

每次在WidgetsApp構建時都會重新生成

import 'dart:math';
...
Random a = Random(10);
...
在build的方法里面

onGenerateTitle: (BuildContext context) =>
          '${a.nextInt(100)}-隨機標題', //生成app的name,不能反回空,返回的是字符串

10、 color: Colors.green,//任務管理器的標題背景顏色

11、 theme //主題

具體的用法如下

 theme: new ThemeData(
          primarySwatch: Colors.red, brightness: Brightness.light),

ThemeData單獨拿一篇文章來給大家演示,演示更直觀些。

11、 showPerformanceOverlay //打開性能監(jiān)視,覆蓋在屏幕最上面。

默認值是false

顯示內容如下
        CPU 15.5fps 60.7ms/frame
        UI 0.5fps 2059.2ms/frame

12、 checkerboardRasterCacheImages

默認值是false

13、 checkerboardOffscreenLayers

默認值是false

14、 showSemanticsDebugger 打開一個覆蓋圖,顯示框架報告的可訪問性信息

默認值是false

15、 debugShowCheckedModeBanner 右上角顯示一個debug的圖標

默認值是false

16、 debugShowMaterialGrid 顯示網格

默認值是false

17、 locale 支持的語言

18、 supportedLocales 支持的多國語言

多國的語言可以查看
https://github.com/Lizhooh/flutter-app-in-action/blob/f8f2e4c4bc34e5c46f8daba518cb404ac4ae6903/docs/%E7%AC%AC%E4%B8%89%E7%AB%A0/3.1.md

 static final List<Locale> supportedLocales = [
    const Locale('en', 'US'),
    const Locale('fi', 'FI'),
  ];

19、 localizationsDelegates 多語言代理

 static final List<LocalizationsDelegate> localizationsDelegates = [
     AppLocalizations.delegate,
     GlobalMaterialLocalizations.delegate,
     GlobalWidgetsLocalizations.delegate,
  ];

20、 localeResolutionCallback 多語言回調

 static Locale localeResolutionCallback(
      Locale locale, Iterable<Locale> supportedLocales) {
    for (var supportedLocale in supportedLocales) {
      if (supportedLocale.languageCode == locale.languageCode) {
        return supportedLocale;
      }
    }
    return supportedLocales.first;
  }
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • Content: Flutter框架概況發(fā)展概述發(fā)展歷史框架特性框架結構 快速入門安裝Flutter在Mac OS...
    EchoZuo閱讀 6,625評論 3 54
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,899評論 2 59
  • 一棵遺失在人間的桂,守候在風口 立地為柱,呵護一處藍天碧水 綠樹成蔭。一只疲倦的牛 擦拭布滿犁鏵的風雪 眷戀一灣淺...
    川北書生_0827閱讀 371評論 0 0

友情鏈接更多精彩內容