前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter之WidgetsApp使用详解&与MaterialApp的纠缠

Flutter之WidgetsApp使用详解&与MaterialApp的纠缠

作者头像
rhyme_lph
发布于 2018-09-13 04:57:15
发布于 2018-09-13 04:57:15
2.1K00
代码可运行
举报
文章被收录于专栏:Flutter&DartFlutter&Dart
运行总次数:0
代码可运行

未经过改装的MaterialApp 可以说MaterialApp基于WidgetsApp

如果对MaterialApp不熟悉,可先看我上一篇文章:

Flutter之MaterialApp使用详解

与MaterialApp相比

18个相同字段:

字段

类型

navigatorKey(导航键)

GlobalKey<NavigatorState>

onGenerateRoute(生成路由)

RouteFactory

onUnknownRoute(未知路由)

RouteFactory

navigatorObservers(导航观察器)

List<NavigatorObserver>

initialRoute(初始路由)

String

builder(建造者)

TransitionBuilder

title(标题)

String

onGenerateTitle(生成标题)

GenerateAppTitle

color(颜色)

Color

locale(地点)

Locale

localizationsDelegates(本地化委托)

Iterable<LocalizationsDelegate<dynamic>>

localeResolutionCallback(区域分辨回调)

LocaleResolutionCallback

supportedLocales(支持区域)

Iterable<Locale>

showPerformanceOverlay(显示性能叠加)

bool

checkerboardRasterCacheImages(棋盘格光栅缓存图像)

bool

checkerboardOffscreenLayers(棋盘格层)

bool

showSemanticsDebugger(显示语义调试器)

bool

debugShowCheckedModeBanner(调试显示检查模式横幅)

bool

WidgetsApp特有的字段:

字段

类型

textStyle(文字样式)

TextStyle

debugShowWidgetInspector(调试小部件检测)

bool

inspectorSelectButtonBuilder(审查员选择按钮生成器)

InspectorSelectButtonBuilder

MaterialApp特有的字段:

字段

类型

home(主页)

Widget

routes(路由)

Map<String, WidgetBuilder>

theme(主题)

ThemeData

debugShowMaterialGrid(调试显示材质网格)

bool

先来介绍WidgetsApp特有的字段吧!

1. textStyle

为应用中的文本使用的默认样式

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//该段代码源自flutter/material/app.dart
//因为MaterialApp都是使用Theme里面的主题色,并且一般部件使用的是MaterialApp部件,所以该textStyle为报错文字的颜色
const TextStyle _errorTextStyle= const TextStyle(
  color: const Color(0xD0FF0000),
  fontFamily: 'monospace',
  fontSize: 48.0,
  fontWeight: FontWeight.w900,
  decoration: TextDecoration.underline,
  decorationColor: const Color(0xFFFFFF00),
  decorationStyle: TextDecorationStyle.double,
  debugLabel: 'fallback style; consider putting your text in a Material',
);
new WidgetsApp(
      color: Colors.grey,
      textStyle: _myTextStyle ,
    );

2. debugShowWidgetInspector

当为true时,打开检查覆盖,该字段只能在检查模式下可用

3. inspectorSelectButtonBuilder

构建一个视图与视图切换的小部件,可以通过该小部件或按钮切换到检查模式(debugShowWidgetInspector==true时才有效,点击该按钮之后再点击你要检查的视图)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new WidgetsApp(
      debugShowWidgetInspector: true,
      inspectorSelectButtonBuilder: (BuildContext context, VoidCallback onPressed) {
          return new FloatingActionButton(
            child: const Icon(Icons.search),
            onPressed: onPressed,
            mini: true,
          );
        },
    );

现在介绍一下MaterialApp特有的字段究竟对WidgetsApp做了什么?

4. home

该字段在MaterialApp中调用的是WidgetsApp的onGenerateRoute 当参数setting.name为Navigator.defaultRouteName(即"/")时返回home的Widget 所以可以推测当程序启动时,会调用一个以"/"为路由名的Widget 下面来看一段源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  Route<dynamic> _onGenerateRoute(RouteSettings settings) {
    final String name = settings.name;
    WidgetBuilder builder;
//判断当前home字段不为空,而且name为Navigator.defaultRouteName
//返回home字段的Widget
    if (name == Navigator.defaultRouteName && widget.home != null) {
      builder = (BuildContext context) => widget.home;
    } else {
//这里查找路由对应的Widget,即为routes字段传入的map
      builder = widget.routes[name];
    }
    if (builder != null) {
//可以看到默认是使用MaterialPageRoute的切换界面动画
      return new MaterialPageRoute<dynamic>(
        builder: builder,
        settings: settings,
      );
    }
    if (widget.onGenerateRoute != null)
      return widget.onGenerateRoute(settings);
    return null;
  }
//下面这里有部分省略
    new WidgetsApp(
        onGenerateRoute: _haveNavigator ? _onGenerateRoute : null,
      )

5. routes

这个字段上面源码已经解释的很清楚 就是在 _onGenerateRoute方法里面查找合适的路由 查找不到才在自身字段onGenerateRoute里面查找

6. theme

该主题主要传入到AnimatedTheme这个部件中,最终传入Theme 用于作为MaterialAPP里面的Widget的主题 一般使用BottomNavigationBar、AppBar这些部件,会应用到这个主题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//如果为空使用默认光亮主题
final ThemeData theme = widget.theme ?? new ThemeData.fallback();
//factory ThemeData.fallback() => new ThemeData.light();
    Widget result = new AnimatedTheme(
      data: theme,
      isMaterialAppTheme: true,
      child: new WidgetsApp(
        key: new GlobalObjectKey(this),
      //..........
      )
    );

7. debugShowMaterialGrid

该字段开启后,会在WidgetsApp外层包裹GridPaper,这个部件主要显示网格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 assert(() {
      if (widget.debugShowMaterialGrid) {
        result = new GridPaper(
          color: const Color(0xE0F9BBE0),
          interval: 8.0,
          divisions: 2,
          subdivisions: 1,
          child: result,
        );
      }
      return true;
    }());

如需转载,请尊重作者,注明出处,否则后果自负!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.08.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL高级】存储过程和函数
存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
陶然同学
2023/02/24
1.1K0
【MySQL高级】存储过程和函数
MySQL 进阶之存储过程/存储函数/触发器
上面给大家演示了存储过程中的基本语法,现在只是在存储过程中定义了一条简单的select 语句 ,并没有任何逻辑。
叫我阿杰好了
2022/11/07
2.5K0
MySQL 进阶之存储过程/存储函数/触发器
MySQL 视图/存储过程/触发器
视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
用户9615083
2022/12/25
2.7K0
MySQL 视图/存储过程/触发器
Mysql高级7-存储过程
  存储过程是事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程思想上很简单,就是数据库sql语言层面的代码封装与重用。
Se7eN_HOU
2023/08/15
8530
MySQL基础-变量/流程控制/游标
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据
用户9645905
2023/04/01
2.3K0
MySQL基础-变量/流程控制/游标
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
注意:用户定义的变量无需对其进行声明或初始化,不声明或初始化获取到的值为NULL。
.29.
2023/11/20
2.4K0
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
MySQL基础-变量/流程控制/游标/触发器
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据
用户9645905
2023/04/02
1.6K0
MySQL基础-变量/流程控制/游标/触发器
第16章_变量、流程控制与游标
在 MySQL 数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。
程序员Leo
2023/08/07
4580
第16章_变量、流程控制与游标
【数据库原理与运用|MySQL】MySQL存储过程(详细超全)
云数据库https://cloud.tencent.com/product/cdb
小小程序员
2022/12/22
1.4K0
【数据库原理与运用|MySQL】MySQL存储过程(详细超全)
Mysql存储过程和存储函数
1.5.2. CASE - WHEN - THEN - ELSE - END CASE
爱撒谎的男孩
2019/12/31
2.1K0
2024Mysql And Redis基础与进阶操作系列(9)作者——LJS[含MySQL存储过程之局部、系统变量、参数传递、流程控制-判断/case具体详步骤;注意点及常见报错问题所对应的解决方法]
存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于 JAVA语言中的方法;
盛透侧视攻城狮
2024/10/22
2360
2024Mysql And Redis基础与进阶操作系列(9)作者——LJS[含MySQL存储过程之局部、系统变量、参数传递、流程控制-判断/case具体详步骤;注意点及常见报错问题所对应的解决方法]
浅谈 MySQL 存储过程与函数
存储过程 和 存储函数说实话本人工作中不经常使用,康师傅也说 阿里开发准则 不建议使用存储过程/函数… 但这并不是咱不会的理由🙃
Java_慈祥
2024/08/06
3320
浅谈 MySQL 存储过程与函数
MySQL进阶笔记-01
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的==示意图==所示 :
千羽
2021/01/14
1.2K0
MySQL进阶笔记-01
MySQL 存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
星哥玩云
2022/09/15
38K0
MySQL 存储过程
MySQL操作之存储过程
是一条或者多条的SQL语句的集合,存储过程就这些SQL封装成一个代码块,以便重复使用。
ha_lydms
2023/08/09
3520
MySQL存储过程学习
作为mysql的初学者,自己看着教程视频,做的笔记,以便日后回顾复习,纯手打,可能有些误差,可指出更正。
sgr997
2022/11/10
4620
MySQL自定义函数和存储过程
MySQL函数是一些具有特定功能的方法,在编写sql时,可以进行使用,从而完成对数据的处理。
半月无霜
2023/03/03
3.1K0
MySQL自定义函数和存储过程
MySQL从删库到跑路_高级(九)——存储过程
游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 尽管游标能遍历结果中的所有行,但一次只指向一行。 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。
良月柒
2019/03/20
7970
【MySQL-18】存储过程各种需求实现合集-[进阶语法]-<if,参数(IN,OUT,INOUT),case,while,repeat,loop,游标cursor,条件处理程序handler>
YY的秘密代码小屋
2024/07/26
1490
【MySQL-18】存储过程各种需求实现合集-[进阶语法]-<if,参数(IN,OUT,INOUT),case,while,repeat,loop,游标cursor,条件处理程序handler>
SQL视图、存储过程、触发器
视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
海盗船长
2023/10/11
4320
推荐阅读
相关推荐
【MySQL高级】存储过程和函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验