第一章: 起步 1.2 初识Flutter

跟随《Flutter实战·第二版》学习,建议直接看原书

  • Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能
  • 开发者可以通过 Dart 语言开发 App,一套代码同时运行在 iOS 和 Android平台
跨平台自绘引擎
  • Flutter 使用自己的高性能渲染引擎来绘制 Widget(组件);不仅可以保证在 Android 和iOS 上 UI 的一致性,也可以避免对原生控件依赖而带来的限制及高昂的维护成本
  • Flutter 底层使用 Skia 作为其 2D 渲染引擎,Skia 是 Google的一个 2D 图形处理函数库,包含字型、坐标转换,以及点阵图,它们都有高效能且简洁的表现
高性能
  • Flutter APP 采用 Dart 语言开发。Dart 在 JIT(即时编译)模式下,执行速度与 JavaScript 基本持平。但是 Dart 支持 AOT,当以 AOT模式运行时,JavaScript 便远远追不上了。执行速度的提升对高帧率下的视图数据计算很有帮助
  • Flutter 使用自己的渲染引擎来绘制 UI ,布局数据等由 Dart 语言直接控制,所以在布局过程中不需要像 RN 那样要在 JavaScript 和 Native 之间通信
采用Dart语言开发

程序主要用两种运行方式: 静态编译与动态解释

静态编译的程序在执行前程序会被提前编译为机器码(或中间字节码),通常将这种类型称为AOT(Ahead Of Time),即"提前编译"。而解释执行则是在运行时将源码实时翻译为机器码来执行,通常将这种类型称为JIT(Just In Time),即"即时编译"

AOT 程序的典型代表是用 C/C++ 开发的应用,它们必须在执行前编译成机器码;而JIT的代表则非常多,如JavaScript、python等,事实上,所有脚本语言都支持 JIT 模式。但需要注意的是 JIT 和 AOT 指的是程序运行方式,和编程语言并非强关联的,有些语言既可以以 JIT 方式运行也可以以 AOT 方式运行,如Python

通常我们区分是否为AOT 的标准就是看代码在执行之前是否需要编译,只要需要编译,无论其编译产物是字节码还是机器码,都属于AOT

Flutter为什么选择Dart语言
  • 开发效率高

    • Dart 运行时和编译器支持 Flutter 的两个关键特性的组合
      • 基于 JIT 的快速开发周期:Flutter 在开发阶段采用,采用 JIT 模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间;
      • 基于 AOT 的发布包: Flutter 在发布时可以通过 AOT 生成高效的机器码以保证应用性能。而 JavaScript 则不具有这个能力。
  • 高性能

    • Flutter 旨在提供流畅、高保真的的 UI 体验。为了实现这一点,Flutter 中需要能够在每个动画帧中运行大量的代码。这意味着需要一种既能提供高性能的语言,而不会出现会丢帧的周期性暂停,而 Dart 支持 AOT,在这一点上可以做的比 JavaScript 更好
  • 快速内存分配

  • 类型安全和空安全

    • 由于 Dart 是类型安全的语言,且 2.12 版本后也支持了空安全特性,所以 Dart 支持静态类型检测,可以在编译前发现一些类型的错误,并排除潜在问题
Flutter 官方提供的 Flutter 框架图.png

简单来讲,Flutter 从上到下可以分为三层:框架层、引擎层和嵌入层

框架层

Flutter Framework,即框架层。这是一个纯Dart实现的SDK,它实现了一套基础库。

  • 底下两层(Foundation和Animation、Painting、Gestures)在Google的一些视频中被合并为一个dart UI层,对应的是Flutter中的dart:ui包,它是Flutter Engine暴露的底层UI库,提供动画、手势及绘制能力。

  • Rendering层,即渲染层,这一层是一个抽象的布局层,它依赖于Dart UI层,渲染层会构建一棵由可渲染对象的组成的渲染树,当动态更新这些对象时,渲染树会找出变化的部分,然后更新渲染。渲染层可以说是Flutter框架层中最核心的部分,它除了确定每个渲染对象的位置、大小之外还要进行坐标变换、绘制(调用底层dart:ui)。

  • Widgets层是Flutter提供的一套基础组件库,在基础组件库之上,Flutter还提供了Material和Cupertino两种视觉风格的组件库,它们分别实现了Material和iOS设计规范。

引擎层

Engine,即引擎层。毫无疑问是 Flutter 的核心, 该层主要是 C++ 实现,其中包括了 Skia 引擎、Dart 运行时、文字排版引擎等。在代码调用 dart:ui库时,调用最终会走到引擎层,然后实现真正的绘制和显示。

嵌入层

Embedder,即嵌入层。Flutter 最终渲染、交互是要依赖其所在平台的操作系统 API,嵌入层主要是将 Flutter 引擎 ”安装“ 到特定平台上。嵌入层采用了当前平台的语言编写,例如 Android 使用的是 Java 和 C++, iOS 和 macOS 使用的是 Objective-C 和 Objective-C++,Windows 和 Linux 使用的是 C++。 Flutter 代码可以通过嵌入层,以模块方式集成到现有的应用中,也可以作为应用的主体。Flutter 本身包含了各个常见平台的嵌入层,假如以后 Flutter 要支持新的平台,则需要针对该新的平台编写一个嵌入层。

如何学习Flutter
资源
  • 官网
  • 源码及注释:源码注释应作为学习 Flutter 的第一文档,Flutter SDK 的源码是包含在 Flutter 工程中的,并且注释非常详细且有很多示例,我们可以通过 IDE 的跳转功能快速定位到源码。实际上,Flutter 官方的组件文档就是通过注释生成的
  • Github
  • Gallery源码:Gallery 是 Flutter 官方示例 APP,里面有丰富的示例,读者可以在网上下载安装。Gallery 的源码在 Flutter 源码 “examples” 目录下
社区
  • StackOverflow: StackOverflow 是目前全球最大的程序员问答社区,现在也是活跃度最高的 Flutter 问答社区
  • https://flutterchina.club
  • 博客

PS: 多动手、多实践

你可能感兴趣的:(第一章: 起步 1.2 初识Flutter)