Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter基础(二)
上面的runApp函数接受给定的Widget并使其成为widget树的根,框架强制根widget覆盖整个屏幕。所以官方不推荐把Widget层的控件来作为根控件,而是以MaterialApp或者WidgetApp作为父节点,上面的MyApp使用build函数构建了一个MaterialApp,将一个Scaffold脚手架包裹在里面,Scaffold显示的才是整个页面
Helloted
2022/06/07
1K0
Flutter基础(二)
Flutter基础widgets教程-WidgetsApp篇
1 WidgetsApp 未经过改装的MaterialApp 可以说MaterialApp基于WidgetsApp 2 构造函数 MaterialApp({ Key key, this.title = '', this.home, this.color, this.textStyle this.theme, this.routes = const <String, WidgetBuilder>{}, this.navigatorKey, this.initial
青年码农
2020/10/10
6040
Flutter基础widgets教程-WidgetsApp篇
Flutter基础widgets教程-MaterialApp篇
1 MaterialApp MaterialApp 是我们app开发中常用的符合MaterialApp Design设计理念的入口Widget。 2 构造函数 MaterialApp({ Key key, this.title = '', this.home, this.color, this.theme, this.routes = const <String, WidgetBuilder>{}, this.navigatorKey, this.initialR
青年码农
2020/10/10
4010
Flutter基础widgets教程-MaterialApp篇
flutter组件之MaterialApp
使用 GlobalKey<NavigatorState> _navigatorKey=new GlobalKey(); ​ new MaterialApp( navigatorKey: _navigatorKey, ); 2. home 进入程序后显示的第一个页面,传入的是一个Widget,但实际上这个Widget需要包裹一个Scaffold以显示该程序使用Material Design风格 使用 class MyApp extends StatelessWidget { /
徐建国
2021/08/02
6170
【Flutter 专题】110 页面间小跳转 (四)
和尚计划针对页面间跳转的路由相关知识做一个汇总,发现有两类特殊方法暂未研究,今天特补充 Navigator 相关方法应用;
阿策小和尚
2021/01/27
4740
【Flutter 专题】110 页面间小跳转 (四)
Flutter之MaterialApp使用详解
22个参数 字段 类型 navigatorKey(导航键) GlobalKey<NavigatorState> home(主页) Widget routes(路由) Map<String, WidgetBuilder> initialRoute(初始路由) String onGenerateRoute(生成路由) RouteFactory onUnknownRoute(未知路由) RouteFactory navigatorObservers(导航观察器) List<NavigatorObserver
rhyme_lph
2018/09/13
5.1K0
Flutter 使用Navigator进行局部跳转页面
老孟导读:Navigator组件使用的频率不是很高,但在一些场景下非常适用,比如局部表单多页填写、底部导航一直存在,每个tab各自导航场景。
老孟Flutter
2020/09/11
1.9K0
【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )
创建空的 dart 文件 StatelessWidgetPage.dart , 导入最基础的材料设计包 ,
韩曙亮
2023/03/28
2.1K0
【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )
Flutter | 路由管理
MaterialPageRoute 是 Material 组件库提供的组件,他可以针对不同的平台,实现与平台页面切换动画风格一致切换动画
345
2022/02/15
1K0
Flutter | 路由管理
Flutter基础widgets教程-ListTile篇
1 ListTile 一个固定高度的行,通常包含一些文本,以及一个行前或行尾图标 2 构造函数 ListTile({ Key key, this.leading, this.title, this.subtitle, this.trailing, this.isThreeLine = false, this.dense, this.visualDensity, this.shape, this.contentPadding,
青年码农
2020/10/10
8510
Flutter基础widgets教程-ListTile篇
flutter 起步
Flutter是谷歌的移动UI框架,可以运行在ios与android系统上,可以以完成app的开发,
ronixiao
2022/09/21
4.9K0
还记得第一个看到的Flutter组件吗?
在学习Flutter的过程中我们第一个看见的控件应该就是MaterialApp,毕竟创建一个新的Flutter项目的时候,项目第一个组件就是MaterialApp,这是一个Material风格的根控件,基本用法如下:
老孟Flutter
2020/03/21
9970
Flutter “跳转页面”(一)
“跳转页面”为啥加双引号,其实所谓的跳转页面可能和以前认识的不太一样。因为在Flutter里,所有能看到的东西一般都是widget,但是,没有说那个app是由一个页面构成的,所以,这个概念确实还是有的。这个功能的实现需要用到两个东西Route和Navigator。
坑吭吭
2018/08/31
2.2K0
Flutter路由管理和页面参数的传递(源码分析)
上一篇 Flutter路由管理和页面参数的传递(获取&返回) 文章中我们讲述了这么用代码实现 Flutter 中页面参数的传递,这一篇我们用源码分析一下 Navigator 为什么可以进行页面参数传递。
静默加载
2020/05/29
1.3K0
Flutter Lesson 4: Flutter组件之App布局组件
首先来看一下我怎么来学习Flutter,我要了解每一个组件,同时,这又是一个App,所以,我的目标是直接生产一个App,里面就是对Flutter组件的介绍,同时写上一些demo以及源代码,这一个点子源于React Native With Code这一款App,在我学习React Native的时候给予了我很大的帮助。如果要构建这样的一款App,我需要先构建一个App首页,包含了一个可以滚动的列表,如果可以,还可以添加一些其他的组件。以及基础的布局组件。
踏浪
2019/07/31
1.8K0
Flutter Lesson 4: Flutter组件之App布局组件
Flutter | 路由管理
MaterialPageRoute 是 Material 组件库提供的组件,他可以针对不同的平台,实现与平台页面切换动画风格一致切换动画
345
2022/02/11
8910
Flutter | 路由管理
动手编写你的第一个 Flutter 应用
我将带领大家尝试编写一个 Flutter 应用,感受一下 Flutter 开发的语法特点和运行效率。
CSDN技术头条
2020/02/26
1K0
【Flutter】Flutter 自定义字体 ( 下载 TTF 字体 | pubspec.yaml 配置字体资源 | 同步资源 | 全局应用字体 | 局部应用字体 )
Flutter 应用字体资源文件 : 在 Flutter 应用根目录下创建 fonts 目录 , 将下载的 ttf 字体放资源文件在该 fonts 目录下 ;
韩曙亮
2023/03/28
3.7K0
【Flutter】Flutter 自定义字体 ( 下载 TTF 字体 | pubspec.yaml 配置字体资源 | 同步资源 | 全局应用字体 | 局部应用字体 )
12.Flutter学习之路由即Android上的页面跳转
Flutter中的路由通俗来讲就是页面跳转,在Flutter中通过Navigator组件管理路由导航。并且提供了管理堆栈的方法,如:Navigator.push和Navigator.pop Flutter提供了两种配置路由跳转的方式:1、基本路由 2、命名路由
易帜
2022/02/09
1.3K0
12.Flutter学习之路由即Android上的页面跳转
Flutter路由管理和页面参数的传递(获取&返回)
在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新的 widget 就可以,相关的参数我们可以直接通过构造函数直接传递。
静默加载
2020/05/29
4.9K0
相关推荐
Flutter基础(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验