E-moss,程序员,爱好阅读和撸狗,主要从事iOS开发工做,公众号:知本集。
主要分享和编写技术方面文章,不按期分享读书笔记,亦可访问“知本集”Git地址:https://github.com/knowtheroot/KnowTheRoot_iOS,欢迎提出问题和讨论。
复制代码
目前hybrid开发模式:前端
1.经过WebView来进行原生和web交互git
2.为了解决WebView性能差的问题,以React Native为表明的一类框架将最终渲染工做交还给了系统,虽然一样使用类HTML+JS的UI构建逻辑,可是最终会生成对应的自定义原生控件,以充分利用原生控件相对于WebView的较高的绘制效率。程序员
Flutter的架构主要分红三层:github
Framework使用dart实现,包括:web
Widgets:能够理解为组件。bash
Engine使用C++实现,主要包括:前端框架
Skia是开源的二维图形库,提供了适用于多种软硬件平台的通用API。架构
Embedder是一个嵌入层。
即把Flutter嵌入到各个平台上去,这里作的主要工做包括渲染Surface设置,线程设置,以及插件等。从这里能够看出,Flutter的平台相关层很低,平台(如iOS)只是提供一个画布,剩余的全部渲染相关的逻辑都在Flutter内部,这就使得它具备了很好的跨端一致性。框架
从架构图能够看出,从头至尾重写一套跨平台的UI框架,包括UI控件、渲染逻辑甚至开发语言。
1.渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,能够在最大程度上保证不一样平台、不一样设备的体验一致性;
2.逻辑处理使用支持AOT的Dart语言,执行效率也比JavaScript高得多。less
目前上主流的思想,都但愿将各个ui控件解耦,慢慢演变出组件化的思想。
Flutter控件主要分为两大类:
顾名思义,StatelessWidget是状态不可变的widget。初始状态设置之后就不可再变化。若是须要变化须要从新建立。
当传入数据改变时会从新渲染UI。
StatelessWidget用来展现静态的文本或者图片。
当传入数据和本类数据改变时StatefulWidget都会从新渲染UI。
若是控件须要根据外部数据或者用户操做来改变的话,就须要使用StatefulWidget。
State的概念来源于Facebook的流行Web框架React,React风格的框架中使用控件树和各自的状态来构建界面,当某个控件的状态发生变化时由框架负责对比先后状态差别而且采起最小代价来更新渲染结果。
Flutter是经过引入了State来保存状态。
当State的状态改变时,能从新构建本节点以及孩子的Widget树来进行UI变化。若是须要主动改变State的状态,须要经过setState()方法进行触发,单纯改变数据是不会引起UI改变的。
Flutter界面渲染过程分为三个阶段:
布局和绘制在**Flutter框架(Framework)中完成,合成则交由引擎(Engine)**负责。
详细的渲染原理将在《Flutter技术原理详解》讲解。
RN的渲染机制是基于前端框架的考虑,复杂的UI渲染是须要依赖多个view叠加。
例如渲染一个复杂的ListView,每个小的控件,都是一个native的view,而后相互组合叠加,当每次滚到刷新时,性能都是一个巨大的考验。