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矩阵变换

这个是有状态的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,//打开性能监控,覆盖在屏幕最上面
    this.checkerboardRasterCacheImages = false,
    this.checkerboardOffscreenLayers = false,
    this.showSemanticsDebugger = false,//打开一个覆盖图,显示框架报告的可访问性信息 显示边框
    this.debugShowCheckedModeBanner = true,//右上角显示一个debug的图标

大家可以新建一个项目,在main.dart文件里面就能看到这个东西啦

       * 如果home首页指定了,routes里面就不能有'/'的根路由了,会报错,/指定的根路由就多余了
       * 如果没有home指定具体的页面,那routes里面就傲有/来指定根路由
       * 路由的顺序按照下面的规则来:
       * 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,不会走路由,优先渲染这个里面的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 //打开性能监视,覆盖在屏幕最上面。

默认值是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;
  }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Content: Flutter框架概况发展概述发展历史框架特性框架结构 快速入门安装Flutter在Mac OS...
    EchoZuo阅读 6,388评论 3 54
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,476评论 2 59
  • 一棵遗失在人间的桂,守候在风口 立地为柱,呵护一处蓝天碧水 绿树成荫。一只疲倦的牛 擦拭布满犁铧的风雪 眷恋一湾浅...
    川北书生_0827阅读 300评论 0 0