先看看官方的解释:前端
Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.
简单翻译一下:web
Flutter是谷歌主导研发的一个UI工具包,能够利用它,使用很是简洁的代码开发出漂亮的、原生的应用程序,不管是在移动端、Web端仍是桌面端。
嗯,加入我的理解:编程
Flutter就是一个UI开发工具包,能够开发各个平台,可是目前最活跃的地方依然 移动平台,虽然他也支持Web、桌面,甚至也将是 Google Fuchsia下开发应用的主要工具。
可是如今,它只是活跃于移动端。
那么,目前移动平台主要有哪些呢?没错,iOS、Android
!小程序
因而,咱们能够简单概述一下Flutter:服务器
Flutter目前被应用最普遍的就是做为iOS、Android跨平台解决方案,并且能够说是目前最优秀的跨平台解决方案。
它不只仅性能优越
,并且开发很是高效
!
为何须要这样一种跨平台解决方案呢?架构
待会儿我会讲到移动端开发的历史(各端独立开发到跨平台开发的出现)以及在整个历史进程中出现的各个痛点,直到Flutter的出现。app
Google公司在国内作过不少宣讲,其中屡次提到Flutter的几个特色:美观、快速、高效、开放
。
这部分了解便可,后面学习过程当中,慢慢体会。
美观框架
使用Flutter内置美丽的Material Design
和Cupertino
widget(什么是widget,不着急)、丰富的motion API、平滑而天然的滑动效果和平台感知,为您的用户带来全新体验。编程语言
固然,在咱们真正学会使用它开发以前,这些东西不能深入的体会,后面你们会慢慢体会到的工具
快速
后面有专门讲解为何性能这么高,先作一个了解便可
Flutter 的 UI 渲染性能很好
。在生产环境下,Flutter 将代码编译成机器码执行,并充分利用 GPU 的图形加速能力,所以使用 Flutter 开发的移动应用即便在低配手机上也能实现每秒 60 帧的 UI 渲染速度。
Flutter 引擎使用 C++ 编写,包括高效的 Skia 2D 渲染引擎,Dart 运行时和文本渲染库。
这个引擎使得 Flutter 框架能够自由、灵活、高效地绘制 UI 组件。而应用开发者则能够用 Flutter 框架来轻松实现各类设计语言和动画效果。
高效
对开发者来讲,使用 Flutter 开发应用十分高效。
Flutter 广受好评的 Hot Reload (热重载)
功能能够在 1 秒内实现代码到 UI 的更新,使得开发操做周期被大幅缩短。
另外,热重载可以在执行的时候保留应用的当前状态 (即 Stateful),好比您可能在修改一个导航结构里的子页面,保留状态的热重载可让您不须要从新从起始页一路点击回到这个子页面,而是在代码修改完成后即刻看到结果。
开放
Flutter 是开放的
,它是一个彻底开源的项目。全球的开发者均可以避免费使用和拓展 Flutter 的源代码,并为 Flutter 的生态和文档做贡献。 咱们已经看到许多中国开发者(好比闲鱼开发团队)活跃在社区中,并为 Flutter 作出了不少贡献。
目前移动端有两大系统:iOS和Android
不少公司为了扩散本身的产品,都须要在两大系统上跑本身的应用程序App
Android版本的App
iOS版本的App
iOS系统
Objective-C
(没用过的人会被他的语法吓到)。Swift
,Swift更加现代化,也更加接近于其余语言,被认为是Objective-C的替代品(可是到如今都尚未替代,两个都在用)。Objective-C和Swift
Android系统
Java
Kotlin
提供最佳支持Java和Kotlin
一般在一个公司,很难让一我的同时去胜任iOS开发和Android开发两个岗位,因此在一家公司可能就须要同时有iOS组和Android组分别针对不一样的系统进行开发。
可是,对于一家小公司来讲,这样的成本是很是高
的。
在很长一段时间内,你们都在需求一种移动端的跨平台解决方案,但愿能够经过一套代码开发出能够同时运行在iOS和Android两个系统上的应用程序
基于 JavaScript 和 WebView的跨平台
最先出现的跨平台框架是基于 JavaScript 和 WebView,表明框架有PhoneGap,Apache Cordova,Ionic 等等。
主要是经过HTML来构建本身的界面,再将其显示在各个平台的WebView中。
可是它默认是不能调用本地的一些服务的(好比相机、蓝牙等),因此须要经过JavaScript进行桥接调用Native的一些代码来完成某些功能。
可是,它自己的体验并不理想,并且开发过程当中的坑很是多。
备受欢迎的React Native
在寻求最佳跨平台解决方案的过程当中,无疑React Native 是以前
最优秀的一个。
React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安卓两大平台。
RN使用JavaScript语言
,相似于HTML的JSX,以及CSS来开发移动应用,所以熟悉Web前端开发的技术人员只需不多的学习就能够进入移动应用开发领域。
而且在保留基本渲染能力的基础上,用原生自带的 UI 组件实现代替了核心的渲染引擎,从而保证了良好的渲染性能。
可是,因为RN的本质是经过JavaScript VM调用远程接口,通讯相对比较低效,并且框架自己不负责渲染,而是是间接经过原生进行渲染的。
还有一个就是在进行iOS和Android适配的过程当中,还要求开发者对两大系统自己有所熟悉才行。
所在在RN上作出很是多贡献的Airbnb以前就宣布放弃RN,而转向Native进行开发。
多是终极的解决方案: Flutter
从Flutter出现到如今,我我的就一直很是看好,由于它可能才是咱们好久依赖所期待的跨平台的终极解决方案。
咱们直接看下面这幅图来对比flutter - native - rn的区别
具体Flutter如何实现接近于原生的高性能的,下一个章节咱们具体分析。
这个章节设计到一些图形绘制的原理,对于某些没有基础的同窗可能会有一些困难,这个没有关系,并不影响后续的学习。
问题:一个图像究竟是如何显示到屏幕上的呢?
首先,你须要知道,咱们在屏幕上能够看到的全部内容都是计算机绘制出来的图像,不管是视频仍是GIF图片,仍是操做系统给咱们看到的图形化界面中的画面,都是图像。
好比下面的一个GIF图片
咱们将它分解出来,就会发现它是不少张图片连续播放所看到的画面
可是咱们为何能看到相似于动画的效果呢?
这是由于它播放的速度很是快,研究代表:
咱们说回到电脑、手机屏幕的显示
事实上显示器就是以固定的频率显示图像的,好比 iPhone的 60Hz、iPad Pro的 120Hz。
一帧图像绘制完毕后准备绘制下一帧时,显示器会发出一个垂直同步信号(VSync),因此 60Hz的屏幕就会一秒内发出 60次这样的信号。
在计算机系统中,CPU、GPU和显示器以一种特定的方式协做:
固然,Android、iOS 的 UI 渲染过程是如此,Flutter 也是如此,在整个 Flutter 架构中,Flutter 只关心向 GPU 提供显示数据,并不关心显示器、视频控制器以及 GPU 是如何工做的。
GPU
将信号同步到 UI 线程
UI 线程
用Dart
来构建图层树
图层树
在GPU 线程
进行合成视图数据
提供给Skia 引擎
Skia 引擎
经过OpenGL 或者 Vulkan
将显示内容提供给GPU
这也是flutter区别于React Native的本质区别:
Flutter为何要选择Dart做为开发语言?
有一种半开玩笑的说法: 由于Dart团队就在Flutter团队的旁边,沟通起来很是方便(是玩笑,也是事实,dart语言自己针对Flutter进行过不少次的优化)
早期的 Flutter 团队评估了十多种语言,并选择了 Dart,由于它符合他们构建用户界面的方式。
其实针对于前端开发者来讲,选择JavaScript看起来更合适,由于你们的入门成本会更低,会有更多人选择学习和使用Flutter。
可是Flutter团队从一开始就决定,不将就
!!!
并不是全部这些功能都是 Dart 独有的,但它们的组合却恰到好处,使 Dart 在实现 Flutter 方面独一无二。所以,没有 Dart,很难想象 Flutter 像如今这样强大。
想要了解Flutter的本质,必须先了解它的底层图像渲染引擎 Skia,前面提到了 Flutter只关心如何构建视图抽象结构,向 GPU提供视图数据。Skia就是 Flutter向 GPU提供数据的途径。
Skia全名Skia Graphics Library(SGL)是一个由C++编写的开源图形库,能在低端设备如手机上呈现高质量的2D图形,最初由Skia公司开发,后被Google收购,应用于Android、Google Chrome、Chrome OS等等当中。
目前,Skia 已然是 Android 官方的图像渲染引擎了,所以 Flutter Android SDK 无需内嵌 Skia 引擎就能够得到自然的 Skia 支持;
而对于 iOS 平台来讲,因为 Skia 是跨平台的,所以它做为 Flutter iOS 渲染引擎被嵌入到 Flutter 的 iOS SDK 中,替代了 iOS 闭源的 Core Graphics/Core Animation/Core Text,这也正是 Flutter iOS SDK 打包的 App 包体积比 Android 要大一些的缘由。
底层渲染能力统一了,上层开发接口和功能体验也就随即统一了,开发者不再用操心平台相关的渲染特性了。也就是说,Skia 保证了同一套代码调用在 Android 和 iOS 平台上的渲染效果是彻底一致的。
不少人看到Google的flutter框架的时候,第一反应就是:别出新东西了,实在学不动了
。
可是做为大前端开发者就是这样,各类折腾:
客户端开发者
:从Android到iOS,或者从iOS到Android,到RN,甚至如今愈来愈多的客户端开发者接触前端相关知识(Vue、React、Angular、小程序)前端开发者
:从jQuery到AngularJS,到三大框架并行:Vue、React、Angular,还有小程序,甚至如今也要接触客户端开发(好比RN、Flutter)大前端开发就是,不像服务器同样可能几年甚至几十年仍是那一套的东西,新技术会层出不穷。
可是每同样技术的出现都会让惊喜,由于他必然是解决了以前技术的某一个痛点的,因此咱们要学会拥抱这种变化。
而且不少知识在学习的过程当中,你会发现他们都是相同的,并非说都要从头再来,最重要的是创建属于本身的知识体系。
不少人对于学习望而却步,主要是基于两点考虑:
dart语言并不复杂,并且很是现代化
flutter并无很是多创新的概念: