Flutter自学笔记
Posted 清_澈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter自学笔记相关的知识,希望对你有一定的参考价值。
Flutter中文网 https://flutterchina.club/
Flutter - 官网 https://flutter.dev/
背景:
在传统的原生开发中,一般都要维护android、ios两个开发团队,版本迭代时,无论人力成本,还是测试成本都会变大。这一点可能对于我们普通的android程序员感受并不深,或者说我们不care这一点。但是站在公司的角度上,如果能够有一套代码,直接就能够开发出android的apk和ios的ipa,是不是意味着我只需要拥有开发维护这套代码的一个团队就可以了?从人力成本上来说,可以让我少发一些工资。而在开发的角度,一套代码也能够很好的完成复用、测试以及UI风格的统一。早在2008年,就有一款叫做“PhoneGap”的框架获了奖并开始支持Android平台。现在我们说的PhoneGap一般指的是"Cordova"。它是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽离出的核心代码,是驱动PhoneGap的核心引擎。两者维护的是共同的一份源代码组件,只有名字和包名不一样。PhoneGap是一个采用html,CSS和javascript来完成跨平台开发的技术,当时PhoneGap宣称接近原生性能。然而它的工作原理是基于WebView,然后利用JavaInterface来完成与原生代码的交互。我们称这种工具为WebView JavaScript Bridge(JsBridge)。这种方式,能够很好的解决跨平台与动态更新的需求但是,我们都知道android WebView的渲染效率很差,同时JavaScript是解释型语言,它不需要编译,在运行时候解释执行,这就导致JavaScript的执行性能太低了。同时因为android自身的问题,使用WebView过程中消耗的内存,没有办法在不需要使用的时候进行及时的回收,这样会导致我们的可用内存越来越少,最终OOM。所以类似Flutter这种框架的出现是必然的,现有的跨平台框架,比如RN都是基于JS,由于JS的执行性能,导致跨平台应用性能一直无法突破瓶颈。而Flutter在Debug使用JIT编译,支持热重载,能够提高我们的开发效率,而Release中利用AOT直接编译成机器码,能够达到更好的性能。从设计角度而言,Flutter提供了非常丰富的Widget组件,能够让我们非常轻松的实现Android或者IOS风格的UI效果。
Flutter是什么?
Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。
Flutter优势
热重载
页面每次改动,不需要手动去刷新,可自动刷新。即支持开发过程中热重载。
统一的UI
Flutter 提供丰富的内置 UI 组件——Material Design(针对 Android)和Cupertino(适用于 iOS ),不需要担心在众多设备上看起来会有什么不同。
Flutter架构
Flutter的架构主要分成三层: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。
2.Engine使用C++实现,主要包括:Skia,Dart和Text。Skia是开源的二维图形库,C++ 的2D绘图引擎,调用GPU来完成渲染,提供了适用于多种软硬件平台的通用API。
3.Embedder是一个嵌入层,即把Flutter嵌入到各个平台上去,这里做的主要工作包括渲染Surface设置,线程设置,以及插件等。从这里可以看出,Flutter的平台相关层很低,平台(如iOS)只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性。
Dart语言介绍
特点:
基于JIT的快速开发周期
Flutter使用dart语言,在开发阶段采用JIT模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间;
基于AOT的发布包lutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能。
为了快速流畅的用户体验需要能够在每个动画帧运行大量的代码,不能有周期性的停顿,否则会造成掉帧。
单线程:
不需要锁,不存在数据竞争和变量状态同步,也没有线程上下文切换的性能损耗和锁导致的卡顿。
垃圾回收
多生代无锁垃圾回收器,专门为UI框架中常见的大量Widgets对象创建和销毁优化。
Flutter与RN的优势
RN是通过JavaScript通过 bridge 传递到native完成原生绘制, bridge 的成本高,因为需要频繁的跨桥调用,导致卡顿等性能问题。
Flutter利用DVM(dart虚拟机) 减少了桥的交互,在运行时期直接执行这些编译后的原生代码,就和我们进行原生开发一样,不再需要Bridge来担任中介的角色
Flutter未来前景
越来越多的厂商使用flutter进行开发,例如阿里,京东金融,腾讯,Flutter的前途一片大好
以上是关于Flutter自学笔记的主要内容,如果未能解决你的问题,请参考以下文章