了解Flutter是什么、它的发展历史、特性以及未来。掌握 Flutter 的基本开发,包括:环境搭建、工程类型、HotReload、Dart 语法以及各种 Widget 的使用
一、Flutter是什么?
Flutter 是 Google 开源的新一代跨平台 UI 框架。不同于其他我们熟知的移动端跨平台方案,Flutter 更像游戏引擎,因为 Flutter 有自己的渲染引擎:我们在 Flutter 上
写了界面后,Flutter 会在自己的 canvas 上渲染。移动端不负责绘制。
二、Flutter的特性
1、跨平台
Flutter 是 Google 新一代的跨平台 UI 框架,除了默认支持的 Android 和 iOS,经过扩展后还支持:
- PC 端:Windows、Linux、MacOS
-
2、高性能
界面可以达到 60 FPS,渲染效率和用户体验堪比 Native。
- Flutter 应用在 Release 下会编译成 Nativie ARM code,使得跨平台的代码运行效率很高。
Native 和 Flutter 之间是通过 JNI 桥接的,也使得 Nativie 和 Flutter 之间交互的损耗很低、
3、丰富的UI组件
Flutter 内置众多精美的 Material Design(Android风格)和 Cupertino(iOS风格)的小部件,而且 UI 样式高度还原 Native 的样式,
可以让我们直接使用,而且这些组件都很方便组合,还有丰富的动画库。4、学习成本低
Flutter 的学习成本很低,屏蔽了底层的很多实现,可以很快的入手。这也带来一个问题,就是没有办法深入 Flutter 的底层。这也是本教程
的目的。除了 Flutter 的使用,也会深入分析 Flutter 的底层实现。5、开发效率高
Flutter 拥有丰富的UI部件,而且支持 Hot Reload,同时Flutter 使用 Dart 语言开发,Dart 具备很多新的语言特性,可以使得开发速度很快。
6、和任何平台的交互都很方便
由于 Flutter 的架构设计,使得 Flutter 可以在任何平台扩展,也可以和平台很方便的交互,从而可以让 Flutter 使用平台的功能。
7、Write once,Run everyWhere
只要写一份代码,就可以构建 Android 和 iOS 两个平台的App,体验能达到和原生应用一致,真正做到 Write once,Run everywhere。
三、移动端跨平台开发方案演进
1、WebView 流
第一种方案,称之为 WebView 流,因为WebView作为一个现实Web页面的容器,它本身是跨平台的,所以利用WebView跨平台属性的技术方案就称之为WebView流,WebView流的发展也经历了如下过程:
纯H5,最开始的时候,是在App里嵌入一个WebView,负责显示H5、可能是独立的一个页面,也有可能是Nativie页面的一部分。但在这个阶段,一方面
webview的性能没有 Native 的好,另一方面,H5 页面和Native 的页面几乎是没有交互的,使得 Native 的开发和 H5的开发是彼此独立的。Native 无法使用H5 的特性,H5 也无法使用 Native 的特性,这些都限制了WebView 的使用场景。- Hybrid,为了打破 Native 和 H5 割裂的情况,就出现了 JSBridge,JSBridge 是Native 代码与 JavaScript 代码的通信桥梁。JSBridge 的出现,使得 H5 可以使用 Native 的能力,Native 也能使用 H5 的能力,使 Native 和 H5 能完美的融合在一起,出现了一系列的 Hybrid 开发框架。比如 PhoneGap 等,这些
架构具有开发成本低,简单、跨平台的优点,但这些 Hybrid 框架是基于 WebView 实现的。所以无法避免 WebView 本身的劣势:内存占用多,网页加载速度慢,渲染慢,javaScript 执行慢等。因为这些性能问题,所以大多数人在开发过程中,主要页面都是使用 Native 开发,只有少数页面才采用 Hybrid 的框架。 基于Hybrid的优化改进方案,针对具体的性能问题,开始有了不同的优化方案,比如,网页加载速度慢,采用离线包的方案,网页渲染效率低。则优化dom树等。虽然性能上有很大提升,但是始终绕不过两大问题,第一个是,WebView 的渲染性能比 Native 差,第二个就 是,JavaScript 是解释执行语言,运行效率也比 Native 差。 所以无论怎么优化,使用 Hybrid 开发的⻚面的性能肯定不会 比 Native 的好。所以,如果是你,你会在自己的 APP 中全部 采用 Hybrid 吗?答案是肯定不会。
2、ReactNative 流
第二种是 ReactNative 流,ReactNative 流是从 WebView 流发展而来,典型的方案是 React Native 和 Weex 。这两种方案,都抛弃了WebView 这个累赘,但是仍然使用 H5 的技术栈开发, 使用 JavaScript 开发,那是如何做到跨平台的呢:
跨平台的布局引擎,ReactNative 内置了跨平台的布局引擎,可以将 H5 的布局转化为Native 的布局。
- 使用 Native 原生组件渲染,将 ReactView 组件使用 Native 原生组件渲染、
JavaScript 引擎,ReactNative 内置 JavaScript 的引擎,从而可以在不同平台上运行JavaScript 代码。ReactNative 流采用 JavaScript + JavaScript 引擎+ Native 的技术 方案,利用了 JavaScript 的跨平台特性实现了移动端的跨平台方案。
3、Flutter
现在跨平台方案有了新的发展方向,就是Flutter。Flutter 开辟了一种全新的思路,利用 Dart 语言,同时支持 JIT 和 AOT 两种编译方式的特性。在不同场景下使用不同的编译方式,达到最高效的开发和运行体验。
在 Debug 模式下,为了保证开发体验,采用 JIT 这种动态编译的方式,将代码运行在 Dart 虚拟机上,使得我们编写的代码可以实时实现更新,实现 HotReload 的特性,提升开发体验。
- 在 Release 模式下,又需要保证运行速度和渲染流程度,则会采用 AOT 的编译方式,将代码直接编译成各自平台的 Native 代码,以此提高使用体验。
- 在 UI 渲染方面,Flutter 的渲染不依赖于平台,基于自带的 Skia 渲染引擎,构建了一套完整的跨平台 UI 渲染框架,在和平台交互方面,Flutter 提供了 Platform Channel 的通道,可以方便的和 Native 交互,可以说是 Google 融合多种技术才有的产物,也是跨平台方案发展的必然产物。
除此之外,一个好的技术,需要完善的文档去让人学习,有专业的人维护,让技术不断发展。在这方面,Flutter既有完善的文档,也有 Google 团队的维护,因此 Flutter 肯定会有更好的发展。