Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter框架分析(一)-- 总览和Window

Flutter框架分析(一)-- 总览和Window

作者头像
HowHardCanItBe
发布于 2020-09-15 07:38:09
发布于 2020-09-15 07:38:09
1.2K00
代码可运行
举报
文章被收录于专栏:从Android到Flutter从Android到Flutter
运行总次数:0
代码可运行

前言

在熟悉了Flutter app开发以后,我们的好奇心会驱使对Flutter框架是如何运行产生诸多疑问,Flutter是如何运转的?Widget到底是什么东西?RenderObject又是个什么鬼?runApp()之后发生了什么?调用sateState()之后页面又是如何刷新的?要解答这些问题,就需要学习一下Flutter框架的源代码。为此我会基于源码写一系列文章来分析一下Flutter框架。本文是第一篇,主要是先介绍一下Flutter框架的总览和基础--Window

总览

Flutter app的页面是如何显示到屏幕上的呢?是什么驱动Flutter app刷新界面,播放动画以及响应触摸事件呢?这一过程可以用下图来描述。

rendering pipline

在Flutter框架中存在着一个渲染流水线(Rendering pipline)。这个渲染流水线是由垂直同步信号(Vsync)驱动的,而Vsync信号是由系统提供的,如果你的Flutter app是运行在Android上的话,那Vsync信号就是我们熟悉的Android的那个Vsync信号。当Vsync信号到来以后,Flutter 框架会按照图里的顺序执行一系列动作: 动画(Animate)、构建(Build)、布局(Layout)和绘制(Paint),最终生成一个场景(Scene)之后送往底层,由GPU绘制到屏幕上。

  • 动画(Animate)阶段:因为动画会随每个Vsync信号的到来而改变状态(State),所以动画阶段是流水线的第一个阶段。
  • 构建(Build)在这个阶段Flutter,在这个阶段那些需要被重新构建的Widget会在此时被重新构建。也就是我们熟悉的StatelessWidget.build()或者State.build()被调用的时候。
  • 布局(Layout)阶段,这时会确定各个显示元素的位置,尺寸。此时是RenderObject.performLayout()被调用的时候。
  • 绘制(Paint)阶段,此时是RenderObject.paint()被调用的时候。

以上是整个渲染流水线的一个大致的工作过程。

Flutter app只有在状态发生变化的时候需要触发渲染流水线。当你的app什么都不做的时候是不需要重新渲染页面的。所以,Vsync信号需要Flutter app去调度。比如我们都知道如果你的某个页面需要发生变化的时候有可能会调用State.setState(),这个调用Flutter框架最终会发起一个调度Vsync信号的请求给底层。然后底层会在Vsync信号到来的时候驱动渲染流水线开始运作,最后把新的页面显示到屏幕上。

Flutter整体架构如下图所示:

Flutter架构

可见整个Flutter架构是分为两部分的。上层的框架(Framework)部分和底层的引擎(Engine)部分。

  • 框架(Framework)部分是用Dart语言写的,也是本系列文章主要涉及的部分。
  • 引擎(Engine)部分是用C++实现的。引擎为框架提供支撑,也是连接框架和系统(Android/iOS)的桥梁。

触发渲染流水线的Vsync信号是来自引擎,渲染完成以后的场景也是要送入引擎来显示,并且Vsync信号的调度也是框架通过引擎来通知系统的。渲染流程从框架和引擎交互的角度用一个示意图来表示就是下面这个样子:

渲染调度示意图

  • 框架通知引擎(scheduleFrame)需要调度一帧。
  • 在系统的Vsync信号到来以后,引擎会首先会回调框架的_beginFrame函数。此时框架的渲染流水线进入动画(Animate)阶段,
  • 在动画(Animate)阶段阶段完成以后。引擎会处理完微任务队列,接着再回调框架的_drawFrame函数。渲染流水线继续按序运行构建、布局和绘制。
  • 绘制结束以后,框架调用render将绘制完成的场景送入引擎以显示到屏幕上。

在前端开发中我们都会对于用户界面有一个窗口(Window)的概念,我们写的程序的UI都是容纳在窗口中的,窗口是框架的根基。界面的绘制,用户输入的事件的处理等等都是要通过窗口来管理。Flutter也不例外。上述框架和引擎渲染交互流程也是统一纳入窗口管理的。所以要了解Flutter框架,首先得从Flutter的窗口开始。

Window

Flutter中的Window来自库dart:ui。相关源代码在window.dart中。

首先,在Flutter中,Window是个单例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// The [Window] singleton. This object exposes the size of the display, the
/// core scheduler API, the input event callback, the graphics drawing API, and
/// other such core services.
final Window window = new Window._();

Window单例对上层提供屏幕尺寸,调度接口,输入事件回调,图形绘制接口以及其他一些核心服务。总体来说,window集中提供了Flutter引擎中和图形界面相关的接口。

Window中和渲染流水线相关的api如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// vcync信号到来以后的回调
FrameCallback _onBeginFrame;
VoidCallback _onDrawFrame;
// 请求engine调度一帧
void scheduleFrame() native 'Window_scheduleFrame';
// 绘制完成后将场景送入engine显示
void render(Scene scene) native 'Window_render';

大家注意一下函数名称后面的native关键字,表明这个函数是调用到engine层的。和Android中的jni调用类似。

除渲染相关的API,window中还有一些其他重要的API也列一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//触摸事件的回调
PointerDataPacketCallback _onPointerDataPacket;
// 获取启动时初始页面的路由
String _defaultRouteName() native 'Window_defaultRouteName';
// 发送PlatfromMessage。这个是Platform channels机制的一部分
String _sendPlatformMessage(String name,
                              PlatformMessageResponseCallback callback,
                              ByteData data) native 'Window_sendPlatformMessage';
//收到platform message后的回调
PlatformMessageCallback _onPlatformMessage;

还有一些和locale,accessbility的相关的API就不列出来了。

总结

至此,Flutter的Window就大概给大家介绍完了。可见Window其实并不复杂,基本上只是对engine层对上提供的和用户界面相关的接口的封装。Flutter框架是基于Window建立起来的。如果你愿意的话,完全可以基于Window搭建起自己的一套框架来取代Flutter :)。在了解了Flutter的渲染流水线和窗口这个基础设施之后。接下来我们会以此为基础,开始奇妙的Flutter框架之旅,敬请期待。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter框架分析(四)-- Flutter框架的运行
前面几篇文章介绍了Flutter框架的渲染流水线,window,初始化以及Widget,Element和RenderObject体系。其中对Widget,Element和RenderObject的介绍主要是一些静态的说明,了解了以上这些技术点之后,在这篇文章里我们会通过动态运行的方式来介绍一下Flutter框架是如何运行的。 从之前介绍的渲染流水线可以知道,这个过程大致可以分为两段操作。第一段是从State.setState()到去engine那里请求一帧,第二段就是Vsync信号到来以后渲染流水线开始重建新的一帧最后送入engine去显示。我们先来看第一段Flutter框架都做了什么。
HowHardCanItBe
2020/09/15
9070
Flutter框架分析(二)-- 初始化
上篇文章《Flutter框架分析(一)-- 总览和Window》介绍了Flutter框架最核心的渲染流水线和最基础的Window。这篇文章里,我们从Flutter框架的初始化来进入,来一步步揭开Flutter的面纱。写过Flutter程序的同学都知道,Flutter app的入口就是函数runApp()。
HowHardCanItBe
2020/09/15
9730
Flutter | 启动,渲染,setState 流程
用了这么久 Flutter 了,居然都不知道他的启动过程,真的是学之有愧啊,今天我们来分析一下 Flutter 的启动流程,以及他的渲染过程,对其做一个简单的剖析。
345
2022/02/11
1.3K0
Flutter的setState更新原理和流程
调用 setState() 必须是没有调用过 dispose() 方法,不然出错,可通过mounted属性来判断调用此方法是否合法。
用户1974410
2022/09/20
1.1K0
Flutter学习之视图体系
经过之前的学习,可以知道Flutter是一种全新的响应式跨平台的移动开发框架,越来越多的开发者参与学习或者研究中,确实在iOS和Android平台上能够用一套代码构建出性能比较高的应用程序。我刚开始接触FlutterFlutter中文网看到这么一句话:Widget是Flutter应用程序用户界面的基本构建块。每个Widget都是用户界面一部分的不可变声明。与其他将试图、控制器、布局和其他属性分离的框架不同,Flutter具有一致的统一对象模型:Widget。在开发过程中也可以知道Widget可以被定义按钮(button)、样式(style)、填充(Padding)、布局(Row)、手势(GestureDetector)等,我刚开始以为这个Widget就是眼中所看到的视图,然而并不是这样的,下面慢慢讲述。
Android技术干货分享
2019/04/01
1.6K0
Flutter学习之视图体系
Flutter 核心原理与混合开发模式
在 「Fan 直播」的 Flutter 混合开发实践中,我们总结了一些 Flutter 混合开发的经验。本文第一篇章将从 Flutter 原理出发,详细介绍 Flutter 的绘制原理,借由此在第二章来对比三种跨端方案;之后再进入第三篇章 Flutter 混合开发模式的讲解,主要是四种不同的 Flutter 混合模式的原理分析;最后的第四篇章,简单分享一下混合工程的工程化探索。 “唯有深入,方能浅出”,对于一门技术,只有了解的深入,才能用最浅显、通俗的话语描述出。在此之前,我写过一些 Flutter 的文
QQ音乐技术团队
2020/07/06
2.4K0
Flutter 的 runApp 与三棵树诞生流程源码分析
从写 Flutter 第一行程序开始我们就知道在 Dart 的 main 方法中通过调用 runApp 方法把自己编写的 Widget 传递进去,只有这样编译运行后才能得到预期效果。你有没有好奇这背后都经历了什么?runApp 为什么这么神秘?或者说,在你入门 Flutter 后应该经常听到或看到过 Flutter 三棵树核心机制的东西,你有真正的想过他们都是什么吗?如果都没有,那么本文就是一场解密之旅。
工匠若水
2021/08/22
9650
Flutter框架分析(三)-- Widget,Element和RenderObject
前面两篇Flutter框架分析的文章介绍了渲染流水线,window和框架的初始化。这篇文章继续来理一下对Flutter app开发者来说比较重要的Widget,Element和RenderObject体系。Flutter的理念是一切都是Widget(Everythin is Widget)。开发者在开发Flutter app的时候主要都是在写很多Widget。那么这三者之间是什么关系?它们是怎么工作的呢?让我们来一探究竟。
HowHardCanItBe
2020/09/15
1.4K0
当 Flutter 遇见 Web,会有怎样的秘密?
作者:haigecao,腾讯 CSIG Web 开发工程师 在线教育团队(简称:OED)已经将 Flutter 这样技术在业务中落地了,做为 IMWeb 前端团队的我们也要进行一些尝试。本文从前端角度进行 Flutter 开发的概况描述。主要是为了让您了解和感受一下:Flutter to Web 的实例、Flutter 为什么会出现、Flutter 设计实现原理、Flutter 技术特点和优势。 前言 OED的客户端团队在 2019 年上半年 ,就已经把 Flutter 落地到企鹅辅导的业务中
腾讯技术工程官方号
2020/02/12
1.4K0
当 Flutter 遇见 Web,会有怎样的秘密?
[Flutter 渲染优化系列] Flutter 渲染性能问题分析
易老师写了很多篇关于 Flutter 渲染引擎的文章,讲的非常深入,我从中学到了很多,昨天很有幸的加到易老师微信,表达了一番崇敬之情,易老师人非常好,也非常谦逊。
老孟Flutter
2021/04/02
2.8K0
flutter渲染详解
runApp方法接收一个Widget类型app值,这个值是我们需要显示的界面Widget, 然后我们看到第一个是调用了WidgetsFlutterBinding.ensureInitialized(),
用户1974410
2022/09/20
1.3K0
跨平台解决方案的技术分析
近 20 年是中国互联网蓬勃发展的时代,以 2010 年为界限,前 10 年是 PC 互联网时代,PC 互联网时代培养了国民上网冲浪的用户习惯,为后 10 多年的以智能手机为终端的移动互联网时代带来丰厚的人口红利,而在移动互联网时代,以智能手机为依托的软硬件也就成为各大互联网公司争夺流量的焦点战场。
winty
2021/08/24
1.3K0
跨平台解决方案的技术分析
Flutter init
main()方法是dart主入口,我们从入口开始看flutter从开始加载到绘制完成都做了那些事情。
CatEatFish
2020/07/09
1.7K0
Flutter init
原生长列表内嵌 Flutter 卡片性能调研
这篇文章主要是对在原生长列表中嵌入多个 Flutter 卡片,每个卡片都对应一个独立的 FlutterView/Engine 这种使用场景进行调研,分析该场景下的性能和内存使用等指标。通过调研,我们希望了解这种使用场景下 Flutter 的性能表现如何,在实际的业务中是否可行。
老孟Flutter
2021/04/02
1.5K0
Flutter 绘制动机 VSYNC 流程源码全方位分析
前面系列我们依赖 Android 平台实现分析了端侧很多机制,但是有一个知识点一直比较迷糊,那就是 Flutter 是怎么被触发绘制的?这个问题在网上的答案基本都说 VSYNC,但是少有人说这个 VSYNC 是怎么被关联起来的,本文就针对这个问题进行一个 Platform 到 Engine 到 Dart Framework 分析,源码依赖 Flutter 2.2.3。
工匠若水
2021/08/22
1.1K0
Flutter 高性能原理浅析
Flutter是Google用以帮助开发者在Ios和Android两个平台开发高质量原生应用的全新移动UI框架.我开始认识Flutter时,经历了三个Flutter重要历史版本.
Rouse
2019/08/09
2.4K0
Flutter 高性能原理浅析
Flutter 2 渲染原理和如何实现视频渲染
声网Agora跨平台开发工程师卢旭辉带来了《Flutter2 渲染原理和如何实现视频渲染》的主题分享,本文是对演讲内容的整理。
音视频开发进阶
2021/11/09
2.1K0
Flutter 2 渲染原理和如何实现视频渲染
跨平台解决方案的技术分析
近 20 年是中国互联网蓬勃发展的时代,以 2010 年为界限,前 10 年是 PC 互联网时代,PC 互联网时代培养了国民上网冲浪的用户习惯,为后 10 多年的以智能手机为终端的移动互联网时代带来丰厚的人口红利,而在移动互联网时代,以智能手机为依托的软硬件也就成为各大互联网公司争夺流量的焦点战场。
程序员海军
2021/11/12
1.5K0
跨平台解决方案的技术分析
让 Flutter 在鸿蒙系统上跑起来
鸿蒙系统 (HarmonyOS)是华为推出的一款分布式操作系统,那么如何在保证开发迭代效率的前提下,以相对低的成本将移动应用快速移植到鸿蒙平台上呢?美团外卖 MTFlutter 团队近期做了一次技术探索,成功地实现了 Flutter 对于鸿蒙系统的原生支持。
美团技术团队
2021/01/27
2.6K0
让 Flutter 在鸿蒙系统上跑起来
跨平台技术演进及Flutter未来
移动互联网发展十余年,伴随着 Android、iOS 等智能手机的不断普及,移动端已逐步取代 PC 端,成为兵家必争之地。正所谓“得移动端者得天下”,移动端已成为互联网领域最大的流量分发入口,一大批互联网公司正是在这大趋势下崛起。
程序亦非猿
2019/11/09
2.1K0
跨平台技术演进及Flutter未来
相关推荐
Flutter框架分析(四)-- Flutter框架的运行
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验