Flutter中深入了解MaterialApp,常用属性解析

2023-11-09

一、Flutter中结构图

在这里插入图片描述

Flutter Framework
FoundationAnimationPaintingGestures合成了Dart UI层,对应的是Flutter中 dart:ui 包,对应的含义是动画、手势、绘制能力。
Rendering层是一个抽象布局层,依赖于Dart UI层,Rendering层会构建一个UI树、当UI树有变化时,会计算出有变化的部分,然后更新UI树,最终绘制在屏幕上
Widgets层是Flutter提供的一套基础组件库
Material、Cupertino是Flutter提供了两种视觉风格的组件库(Android、iOS)

Flutter Engine
这是一个纯C++实现的SDK,主要执行相关的渲染、线程管理、平台事件等操作。其中包括了Skia引擎、Dart运行时、文字排版引擎等。在调用dart:ui库是,其实最终会走到Engine层,实现真正的绘制逻辑

Flutter Embedder
提供四个Task Runner,将引擎一直到平台中间层代码的渲染设置、原生插件、打包、线程管理、时间循环、交互操作等。

二、Material介绍

MaterialApp 包含了许多的 Widget ,这些 Widget 通常是实现 Material Design
的应用程序所必须要的,包含的 Widget 可以在 Material Components widgets 中查看所有。

字段 属性 描述
navigatorKey GlobalKey<NavigatorState> 导航键
scaffoldMessengerKey GlobalKey<ScaffoldMessengerState> 脚手架键
home Widget 主页,应用打开时显示的页面
routes Map<String, WidgetBuilder> 应用程序顶级路由表
initialRoute String 如果构建了导航器,则会显示第一个路由的名称
onGenerateRoute RouteFactory 路由管理拦截器
onGenerateInitialRoutes InitialRouteListFactory 生成初始化路由
onUnknownRoute RouteFactory 当onGenerateRoute无法生成路由时调用
navigatorObservers List<NavigatorObserver> 创建导航器的观察者列表
builder TransitionBuilder 在导航器上面插入小部件
title String 程序切换时显示的标题
onGenerateTitle GenerateAppTitle 程序切换时生成标题字符串
color Color 程序切换时应用图标背景颜色(仅安卓有效)
theme ThemeData 主题颜色
darkTheme ThemeData 暗黑模式主题颜色
highContrastTheme ThemeData 系统请求“高对比度”使用的主题
highContrastDarkTheme ThemeData 系统请求“高对比度”暗黑模式下使用的主题颜色
themeMode ThemeMode 使用哪种模式的主题(默认跟随系统)
locale Locale 初始区域设置
localizationsDelegates Iterable<LocalizationsDelegate<dynamic>> 本地化代理
localeListResolutionCallback LocaleListResolutionCallback 失败或未提供设备的语言环境
localeResolutionCallback LocaleResolutionCallback 负责计算语言环境
supportedLocales Iterable<Locale> 本地化地区列表
debugShowMaterialGrid bool 绘制基线网格叠加层(仅debug模式)
showPerformanceOverlay bool 显示性能叠加
checkerboardRasterCacheImages bool 打开栅格缓存图像的棋盘格。
checkerboardOffscreenLayers bool 打开渲染到屏幕外位图的层的棋盘格。
showSemanticsDebugger bool 打开显示可访问性信息的叠加层
debugShowCheckedModeBanner bool 调试显示检查模式横幅
shortcuts Map<LogicalKeySet, Intent> 应用程序意图的键盘快捷键的默认映射。
actions Map<Type, Action<Intent>> 包含和定义用户操作的映射
restorationScopeId String 应用程序状态恢复的标识符
scrollBehavior ScrollBehavior 可滚动小部件的行为方式
三、属性解析
1.navigatorKey

navigatorKey 相当于 Navigator.of(context) ,如果应用程序想实现无 context 跳转,那么可以通过设置该key, 通过 navigatorKey.currentState.overlay.context 获取全局context

使用方式

GlobalKey<NavigatorState> navigatorKey = new GlobalKey();
navigatorKey: navigatorKey ,
2.home

传入Widget组件,显示第一个页面

3.debugShowCheckedModeBanner

调试显示检查模式横幅,一般设置为false

debugShowCheckedModeBanner: false,
4.onGenerateRoute

当跳转路由时,如果在 routes 找不到对应的 key ,会执行该回调,会调用会返回一个 RouteSettings ,该对象中有 name 路由名称、 arguments 路由参数。

//在之前的文章中讲过如何进行统一路由配置
onGenerateRoute: AppRouteManager.getInstance().onGenerateRoute,
5.initialRoute

初始路由,如果设置了该参数并且在 routes 找到了对应的key,将会展示对应的 Widget ,否则展示 home

 MaterialApp(
   routes: {
     "/home": (_) => Home(),
     "/my": (_) => My()
   },
   initialRoute: "/home",
 )
6.builder

在构建MaterialApp的Widget tree时,也就是加载child之前给child参数上再加一个父节点。所以一些toast库等需要全局context的三方库,会用builder将自己加到widget tree中。

builder: EasyLoading.init(),
7.theme

指定整个App主题颜色

MaterialApp(
  theme: ThemeData(
    // 主要颜色
    primaryColor: Colors.pink
  ),
)
8.scaffoldMessengerKey

scaffoldMessengerKey 主要是管理后代的 Scaffolds,可以实现无 context 调用 snack bars

GlobalKey<ScaffoldMessengerState> _Key = GlobalKey();
MaterialApp(
  scaffoldMessengerKey: _Key,
);
_scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("show SnackBar")));
9.onGenerateInitialRoutes

如果提供了 initialRoute ,则用于生成初始路由的路由生成器回调,如果未设置此属性,则底层 Navigator.onGenerateInitialRoutes 将默认为 Navigator.defaultGenerateInitialRoutes

10.onUnknownRoute

效果和 onGenerateRoute 一样,只是先走 onGenerateRoute ,如果无法生成路由时则在调用 onUnknownRoute

MaterialApp(
   routes: {
     "/home": (_) => Home(),
     },
   initialRoute: "/home",
   onGenerateRoute: (setting) {
     return null;
   },
   onUnknownRoute: (setting) {
     return MaterialPageRoute(builder: (_) => Home());
   },
)
11.navigatorObservers

对路由堆栈变化进行监听

  static final RouteObserver<PageRoute> routeObserver =
      RouteObserver<PageRoute>();
      navigatorObservers: [MyApp.routeObserver],
12.title

Android:任务管理器的程序快照之上
IOS: 程序切换管理器中

 return MaterialApp(
      title: '油尚行',)
13.localizationsDelegates

用来存放自定义的多语言资源

  localizationsDelegates: [
        RefreshLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate
      ],
14.supportedLocales

当应用程序支持不同语言的时候,就需要对应用程序进行国际化

MaterialApp(
  title: 'Flutter IntlApp',
  supportedLocales: [
    const Locale('zh'),
    const Locale('en'),
  ],
)
15.localeResolutionCallback

监听系统语言切换事件,一些安卓系统特性,可设置多语言列表,默认以第一个列表为默认语言

      localeResolutionCallback:
          (Locale locale, Iterable<Locale> supportedLocales) {
        //print("change language");
        return locale;
      },

附录:
在src中com文件目录下
1.Flutter Engine使用
在这里插入图片描述
2.Flutter Embedder使用
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter中深入了解MaterialApp,常用属性解析 的相关文章

  • 如何向 Android Studio 中的现有项目添加新活动?

    在 Eclipse 中 您只需单击 新建 按钮并选择 Android 活动即可添加新活动 但 Android Studio 有点不同 我无法找到如何向项目添加新活动 要添加一个Activity使用 Android Studio 此步骤与添加
  • RecyclerView 在聊天屏幕中的 notificationDataSetChanged 上滚动到顶部

    我正在尝试使用 recyclerView 创建消息传递类型的屏幕 该屏幕将从底部开始 并在用户到达聊天顶端时加载更多数据 但我面临着这个奇怪的问题 我的 recyclerView 在调用 notificationDataSetChanged
  • 警报对话框中的 Webview 不显示内容

    我正在开发一个 Android 应用程序 我需要在网络视图和警报对话框上显示一个网站 该站点显示在网络视图中 但不显示在警报对话框中 到目前为止 这是我的代码 WebView WebView myWebView WebView v find
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • 无需 iPhone 6 Plus 即可预览 iOS 应用程序

    我已经在 Yosemite 中使用 iPhone 6 和 Quicktime 完成了 iOS 应用程序预览 视频 但我无法在 iTunes Connect 中为 iPhone 6 上传它 而且我没有 iPhone 6 设备 有没有办法在没有
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • Android应用主题更换流畅

    我正在开发一个提供白天和夜间主题的项目 我正在更改主题 夜间主题 AppCompatDelegate setDefaultNightMode AppCompatDelegate MODE NIGHT YES 日主题 AppCompatDel
  • iOS 设置 MKMapView 中心,因此提供的位置位于底部中心

    我有一个 MKMapView 和一个永不改变的 CLLocationCooperative2D 我想做的是将地图居中 以便该坐标将放置在地图的底部中心 我可以用简单的方法将地图集中在这个坐标上 MKCoordinateRegion view
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • 为什么 Google 建议将库复制到您的树中?

    谷歌的Play 服务 API 的使用说明 http developer android com google play services setup html 例如 说 将 extras google google play service
  • Android:分配内存失败

    我正在尝试创建一个具有 2047 mb 内存的模拟器 当我运行它时 我收到此错误 2011 02 22 14 24 14 Emulator 2011 02 22 14 24 14 Emulator This application has
  • iOS 使用 NSColor 与 UIColor?

    有什么区别UIColor and NSColor 什么时候会使用每一种 我碰到NSColor在试图弄清楚的同时UIColor用于 iOS 中的属性字符串 我理解使用UIColor对于 UIKit 等 但我不认为NSColor对于这种事情确实
  • android系统用户和linux root用户有什么区别

    当我将手机连接到电脑并使用adb shell与我的手机通信并输入的命令ps命令输出当前在我的手机上运行的进程信息 我发现有两个特殊用户 一个是root 另一个是system 据我所知 Android是基于linux的 所以root用户是最大
  • Activity 暂停时调用 FragmentManager.popBackStack 是否安全

    的文档FragmentManager popBackStack https developer android com reference android app FragmentManager html popBackStack java
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • 机器学习和深度学习引用量最高的20篇论文(2014-2017)

    机器学习和深度学习的研究进展正深刻变革着人类的技术 本文列出了自 2014 年以来这两个领域发表的最重要 被引用次数最多 的 20 篇科学论文 以飨读者 机器学习 尤其是其子领域深度学习 在近些年来取得了许多惊人的进展 重要的研究论文可能带
  • 1200兆路由器网速_家庭网络配置问题案例:六类网线上网速度只有100兆

    有这样一个案例 家中布置了一根6类网线 8芯中间带个塑料十字的双绞线 网线约10米长 全部为埋地管道暗线 水晶头为568B线序 电脑插也为6类 西门子 568B线序接法 现在出现一个问题 就是网线一个连接移动光猫 为路由器模式 千兆口 然后
  • mac-右键-用VSCode打开

    1 点击访达 搜索自动操作 2 选择快速操作 3 执行shell脚本 替换代码如下 for f in do open a Visual Studio Code f done command s保存会出现一个弹框 保存为 用VSCode打开
  • IDEA2021.2创建java web项目(很详细,手把手创建)

    该文章适合人群 初学java web 不用maven或者gradle创建java web项目 忘记了怎么创建web项目 错误示范 上来直接创建java ee 项目 这样创建出来的项目有Maven或者Gradle包管理 正确演示 1 创建项目
  • “威胁”员工全来上班后,马斯克“尴尬”了:车没地停、工位不够坐、Wi-Fi 还太差

    点击蓝色 程序员黄小斜 关注我哟 加个 星标 每天和你一起多进步一点点 整理 郑丽媛 出品 程序人生 ID coder life 每一个特斯拉员工每周都要在办公室工作 40 个小时 如果你不来 那么我们就认为你辞职了 在马斯克 蛮横 地放出
  • python机器学习——NLTK及分析文本数据(自然语言处理基础)

    NLTK NLTK Natural Language Toolkit 自然语言处理工具包 在NLP 自然语言处理 领域中 最常使用的一个Python库 自带语料库 词性分类库 自带分类 分词功能 NLTK安装 安装 pip install
  • OpenCart 常见错误解决

    1 GC 报错 错误内容 opencart SessionHandler gc ps files cleanup dir opendir var lib php5 failed Permission denied 解决方法 更改 php i
  • 【论文记录】Boosting Detection in Crowd Analysis via Underutilized Output Features

    Boosting Detection in Crowd Analysis via Underutilized Output Features Abstract Crowd Hat使用一种混合的2D 1D压缩技术进行细化空间特征与获取特定人群
  • k8s删除pod镜像没响应marking for deletion pod TaintManagerEviction

    使用命令强制删除 Pod的状态为 Marking for deletion 表示该Pod正在被标记为待删除状态 但实际上并没有被删除 这可能是因为以下原因之一 删除操作被阻塞 可能是由于某些资源或容器正在使用该Pod 导致删除操作被阻塞 您
  • Python报错:module 'scipy' has no attribute 'xxx'

    首先看使用的函数在不在这几个当中 以 interpolate 为例 scipy 将 interpolate 单独定义为一个小子库 所以调用的时候不能单独写 import scipy 而是要写成 import scipy interpolat
  • 路由器打印机服务器系统,路由器怎么设置打印机服务器

    路由器怎么设置打印机服务器 内容精选 换一换 CDC Change Data Capture 即数据变更抓取 通过为源端数据源开启CDC ROMA Connect可实现数据源的实时数据同步以及数据表的物理删除同步 ROMA Connect支
  • DS排序--希尔排序

    目录 题目描述 思路分析 AC代码 题目描述 给出一个数据序列 使用希尔排序算法进行降序排序 间隔gap使用序列长度循环除2直到1 输入 第一行输入t 表示有t个测试示例 第二行输入n 表示第一个示例有n个数据 n gt 1 第三行输入n个
  • PowerBUS 双总线收发器

    随着智能化的发展 人的需求变高 在一个环境内 如果子设备较多 距离适中 大多数是布置485总线加电源地需要4根线 这样就会导致走线复杂 线的成本也较高 如果用BLE或者wifi无线连接时也需要电源地2根线 成本更高 而powerbus双总线
  • Android基础学习总结(十六)——基于ijkplayer封装支持简单界面UI定制的视频播放器

    前言 项目开发中遇到需要解析播放m3u8视频流的情况 但是原生的PlayerView非常慢 使用起来复杂 不适合上手 这里找到一款ijkplayer是Bilibili基于ffmpeg开发并开源的轻量级视频播放器 支持播放本地网络视频 也支持
  • [Spring学习]04 Spring IOC创建Bean的几种方式

    目录 一 调用构造器创建Bean对象 二 调用静态工厂方法创建Bean对象 三 调用实例 动态 工厂方法创建Bean对象 一 调用构造器创建Bean对象 通过调用构造器创建Bean对象是我们在实际开发中最常用的方式 而构造器创建Bean对象
  • 运维小知识之企业内部NTP服务器基础安装与配置使用

    0x00 前言简述 基础概念 服务方式 公共 NTP 服务器 0x01 服务器安装配置 CentOS Ubuntu 1 NTP 服务 2 Chrony 服务 0x02 NTP客户端配置 Windows 服务器 Linux 服务器 0x04
  • YOLO系列梳理(三)YOLOv5

    前言 YOLOv5 是在 YOLOv4 出来之后没多久就横空出世了 今天笔者介绍一下 YOLOv5 的相关知识 目前 YOLOv5 发布了新的版本 6 0版本 在这里 YOLOv5 也在5 0基础上集成了更多特性 同时也对模型做了微调 并且
  • 计网第五章(运输层)(七)(TCP的连接建立)

    目录 一 基本概述 二 连接建立 1 基本任务 2 具体实现 三 经典问题之为什么不用 两次握手 一 基本概述 在前面的部分提到过 TCP是基于运输连接来传输TCP报文段 所以TCP的连接和释放是每次面向连接的通信过程中必不可少的过程 TC
  • 7-16 插松枝

    人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上 做成大大小小的松枝 他们的工作流程 并不 是这样的 每人手边有一只小盒子 初始状态为空 每人面前有用不完的松枝干和一个推送器 每次推送一片随机型号的松针片 工人首先捡起一根空的松枝干
  • Flutter中深入了解MaterialApp,常用属性解析

    一 Flutter中结构图 Flutter Framework Foundation Animation Painting Gestures合成了Dart UI层 对应的是Flutter中 dart ui 包 对应的含义是动画 手势 绘制能