面试官: 你有用过Flutter吗? Flutter架构是怎么样,为何会比其余如ReactNative好
心理分析: 面试官所在的项目是用Flutter 开发的,或者正在转Flutter这种技术。若是你不会,面试官在第一眼会认为后面来应聘的人或许会、为了杜绝这种状况发生,你必定要说之前研究过,写过相关代码。其实”有用过Flutter“对大多数求职只是 会与不会 的问题。这不是面试官 想了解的。面试官的重点 你了解的有多深。
接下来,会问你他的原理 你是怎么看。 它的优缺点。为何比其余的好。从原理层来解析。这才是最难的。
这篇文章 从原理层说明他们的区别
求职者: 应该作好被虐的准备。若是看了这篇文章,应付下来基本没有多大的问题
在Flutter诞生以前,已经有许多跨平台UI框架的方案,好比基于WebView的Cordova、AppCan等,还有使用HTML+JavaScript渲染成原生控件的React Native、Weex等。
更多面试内容,面试专题,flutter视频 全套,音视频从0到高手开发。
关注GitHub:https://github.com/xiangjiana/Android-MS
免费获取面试PDF合集
VX:mm14525201314git
首先看一下Flutter的架构图github
Framework
Engine
Embedder
1.Framework使用dart实现,包括Material Design风格的Widget,Cupertino(针对iOS)风格的Widgets,文本/图片/按钮等基础Widgets,渲染,动画,手势等。此部分的核心代码是:flutter仓库下的flutter package,以及sky_engine仓库下的io,async,ui(dart:ui库提供了Flutter框架和引擎之间的接口)等package。web
2.Engine使用C++实现,主要包括:Skia,Dart和Text。Skia是开源的二维图形库,提供了适用于多种软硬件平台的通用API面试
3.Embedder是一个嵌入层,即把Flutter嵌入到各个平台上去,这里作的主要工做包括渲染Surface设置,线程设置,以及插件等。从这里能够看出,Flutter的平台相关层很低,平台(如iOS)只是提供一个画布,剩余的全部渲染相关的逻辑都在Flutter内部,这就使得它具备了很好的跨端一致性。编程
从架构图能够看出,从头至尾重写一套跨平台的UI框架,包括UI控件、渲染逻辑甚至开发语言。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,能够在最大程度上保证不一样平台、不一样设备的体验一致性,逻辑处理使用支持AOT的Dart语言,执行效率也比JavaScript高得多浏览器
目前上主流的思想,都但愿将各个ui控件接耦,慢慢演变出组件化的思想。
Flutter控件主要分为两大类,安全
StatelessWidget
用来展现静态的文本或者图片,若是控件须要根据外部数据或者用户操做来改变的话,就须要使用StatefulWidget
。数据结构
State的概念也是来源于Facebook的流行Web框架React,React风格的框架中使用控件树和各自的状态来构建界面,当某个控件的状态发生变化时由框架负责对比先后状态差别而且采起最小代价来更新渲染结果。架构
从下图这里能够看出 Flutter和 React-Native之众的本质区别:React-Native之类只是扩展调用 OEM组件,而 Flutter是本身渲染。框架
在 Flutter Architecture的解释中,Google还提供了一张更为详尽的图来解释 Flutter的原理:
这张图解释得更清晰一些:Flutter只关心向 GPU提供视图数据,GPU的 VSync信号同步到 UI线程,UI线程使用 Dart来构建抽象的视图结构,这份数据结构在 GPU线程进行图层合成,视图数据提供给 Skia引擎渲染为 GPU数据,这些数据经过 OpenGL或者 Vulkan提供给 GPU。
因此 Flutter并不关心显示器、视频控制器以及 GPU具体工做,它只关心 GPU发出的 VSync信号,尽量快地在两个 VSync信号之间计算并合成视图数据,而且把数据提供给 GPU。
了解 Flutter的基本概念后,天然有几个疑问亟待解决。
前面提到了 Flutter只关心如何构建视图抽象结构,向 GPU提供视图数据。Skia就是 Flutter向 GPU提供数据的途径。
咱们可能只知道 Flutter作了什么,始终都尚未从侧面观察 Flutter的整个架构设计,了解 Flutter如何去作。
这张图了解过 Flutter的人可能不少地方都看过,这边来详细解释一下:
Flutter Framework: 这是一个纯 Dart实现的 SDK,相似于 React在 JavaScript中的做用。它实现了一套基础库, 用于处理动画、绘图和手势。而且基于绘图封装了一套 UI组件库,而后根据 Material 和Cupertino两种视觉风格区分开来。这个纯 Dart实现的 SDK被封装为了一个叫做 dart:ui的 Dart库。咱们在使用 Flutter写 App的时候,直接导入这个库便可使用组件等功能。
Flutter Engine: 这是一个纯 C++实现的 SDK,其中囊括了 Skia引擎、Dart运行时、文字排版引擎等。不过说白了,它就是 Dart的一个运行时,它能够以 JIT、JIT Snapshot 或者 AOT的模式运行 Dart代码。在代码调用 dart:ui库时,提供 dart:ui库中 Native Binding 实现。 不过别忘了,这个运行时还控制着 VSync信号的传递、GPU数据的填充等,而且还负责把客户端的事件传递到运行时中的代码。
在了解屏幕绘图的基本原理和 Flutter的一个总体概念后,咱们下面详细地来看一下 Flutter的大概实现。
要理解 Flutter的原理,咱们从 entry point开始看 Flutter的代码。因为应用框架大同小异,因此下文说起 Flutter的代码即指代 Flutter Engine的代码,而非 Flutter Dart Framework代码。
下图是我简单整理了一下 Flutter应用启动后的执行顺序
能够的。
更多面试内容,面试专题,flutter视频 全套,音视频从0到高手开发。
关注GitHub:https://github.com/xiangjiana/Android-MS
免费获取面试PDF合集