首页 > 其他分享 >初识 Flutter

初识 Flutter

时间:2024-08-23 10:40:16浏览次数:13  
标签:引擎 JavaScript 初识 Dart JIT AOT Flutter

一、Flutter 简介

Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter 提供了丰富的组件、接口,开发者可以很快地为 Flutter 添加 Native(即原生开发,指基于平台原生语言来开发应用,flutter 可以和平台原生语言混合开发) 扩展。下面我们整体介绍一下 Flutter 技术的主要特点。


1.1 跨平台自绘引擎

Flutter 与用于构建移动应用程序的其他大多数框架不同,因为 Flutter 既不使用 WebView,也不使用操作系统的原生控件。 相反,Flutter 使用自己的高性能渲染引擎来绘制 Widget(组件)。这样不仅可以保证在 Android 和iOS 上 UI 的一致性,也可以避免对原生控件依赖而带来的限制及高昂的维护成本。

Flutter 底层使用 Skia 作为其 2D 渲染引擎,Skia 是 Google的一个 2D 图形处理函数库,包含字型、坐标转换,以及点阵图,它们都有高效能且简洁的表现。Skia 是跨平台的,并提供了非常友好的 API,目前 Google Chrome浏览器和 Android 均采用 Skia 作为其 2D 绘图引擎。


1.2 高性能

Flutter 高性能主要靠两点来保证:

  • Flutter App 采用 Dart 语言开发。Dart 在 JIT(即时编译)模式下,执行速度与 JavaScript 基本持平。但是 Dart 支持 AOT,当以 AOT模式运行时,JavaScript 便远远追不上了。执行速度的提升对高帧率下的视图数据计算很有帮助。

  • Flutter 使用自己的渲染引擎来绘制 UI ,布局数据等由 Dart 语言直接控制,所以在布局过程中不需要像 RN 那样要在 JavaScript 和 Native 之间通信,这在一些滑动和拖动的场景下具有明显优势,因为在滑动和拖动过程往往都会引起布局发生变化,所以 JavaScript 需要和 Native 之间不停地同步布局信息,这和在浏览器中JavaScript 频繁操作 DOM 所带来的问题是类似的,都会导致比较可观的性能开销。


1.3 采用Dart语言开发

这个是一个很有意思但也很有争议的问题,在了解 Flutter 为什么选择了 Dart 而不是 JavaScript 之前我们先来介绍一下之前提到过的两个概念:JIT 和 AOT。

程序主要有两种运行方式:静态编译与动态解释。静态编译的程序在执行前程序会被提前编译为机器码(或中间字节码),通常将这种类型称为 AOT (Ahead of time)即 “提前编译”。而解释执行则是在运行时将源码实时翻译为机器码来执行,通常将这种类型称为 JIT(Just-in-time)即“即时编译”。

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

现在我们看看 Flutter 为什么选择 Dart 语言?本人根据官方解释以及自己对 Flutter 的理解总结了以下几条(由于其他跨平台框架都将 JavaScript 作为其开发语言,所以主要将 Dart 和 JavaScript 做一个对比):

  1. 开发效率高

    Dart 运行时和编译器支持 Flutter 的两个关键特性的组合:

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

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

  3. 快速内存分配

    Flutter 框架使用函数式流,这使得它在很大程度上依赖于底层的内存分配器。因此,拥有一个能够有效地处理琐碎任务的内存分配器将显得十分重要,在缺乏此功能的语言中,Flutter 将无法有效地工作。当然 Chrome V8 的 JavaScript 引擎在内存分配上也已经做的很好,事实上 Dart 开发团队的很多成员都是来自Chrome 团队的,所以在内存分配上 Dart 并不能作为超越 JavaScript 的优势,而对于Flutter来说,它需要这样的特性,而 Dart 也正好满足而已。

  4. 类型安全和空安全

    由于 Dart 是类型安全的语言,且 2.12 版本后也支持了空安全特性,所以 Dart 支持静态类型检测,可以在编译前发现一些类型的错误,并排除潜在问题,这一点对于前端开发者来说可能会更具有吸引力。与之不同的,JavaScript 是一个弱类型语言,也因此前端社区出现了很多给 JavaScript 代码添加静态类型检测的扩展语言和工具,如:微软的 TypeScript 以及Facebook 的 Flow。相比之下,Dart 本身就支持静态类型,这是它的一个重要优势。

二、Flutter框架结构

我们看一下 Flutter 官方提供的 Flutter 框架图,如下图所示:

Flutter_know_A.png


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


2.1 框架层

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 设计规范。

Flutter 框架相对较小,因为一些开发者可能会使用到的更高层级的功能已经被拆分到不同的软件包中,使用 Dart 和 Flutter 的核心库实现,其中包括平台插件,例如 camera (opens new window)webview (opens new window),以及和平台无关的功能,例如 animations (opens new window)

我们进行Flutter 开发时,大多数时候都是和 Flutter Framework 打交道。


2.2 引擎层

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


2.3 嵌入层

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


标签:引擎,JavaScript,初识,Dart,JIT,AOT,Flutter
From: https://www.cnblogs.com/linuxAndMcu/p/18375485

相关文章

  • 搭建 Flutter 开发环境
    理论上可以使用任何文本编辑器与命令行工具来构建Flutter应用程序。不过,Flutter官方建议使用AndroidStudio和VSCode之一以获得更好的开发体验。这里选择使用VisualStudioCode作为编辑器,下面介绍其的安装。一、安装VSCode下载适用于Windows的VisualStudio......
  • flutter在本地化后启动时显示黑屏
    Flutter是一种跨平台的移动应用开发框架,可以同时在iOS和Android平台上构建高性能、美观的应用程序。当Flutter应用程序在本地化后启动时显示黑屏,可能是以下几个原因导致的:资源加载问题:在应用程序本地化后,可能存在资源文件加载失败的情况,导致应用程序无法正常显示。可以检查资源......
  • 初识方法
    1.方法是什么1.java方法是语句的合集,放在一起执行一个功能。2.方法包含于类或对象中3.方法在程序中被创建,在其他地方被引用2.方法的原则:原子性一个方法只能完成一个功能3.在main方法外计算1.先在main外面书写一个加法方法2.再在main里面直接输出加法方法总览:......
  • 初识JavaScript
    1.什么是JavaScriptJavaScript(JS)是⼀种具有函数优先的轻量级,解释型或即时编译型的编程语⾔。虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名的,但是它也被⽤到了很多⾮浏览器环境中,例如Node.js、ApacheCouchDB和AdobeAcrobat。JavaScript是⼀种基于原型编程、多范式的......
  • android开发通过wireshark实现flutter应用抓包
    android开发通过wireshark实现flutter应用抓包1.为什么要使用wireshark抓包1.有了上一篇Charles的抓包文章,为什么还写这篇抓包文章呢?单独论http请求抓包的话Charles比wireshark好用2.这是因为flutter应用使用的不是系统的证书,而是使用flutter框架自己的证书,这就导致了Char......
  • 【C++篇】迈入新世界的大门——初识C++(下篇)
    文章目录前言引用引用的概念和定义引用的特性引用的使用const引用指针和引用的关系inline#define定义宏inlinenullptr前言接上篇:【C++篇】迈入新世界的大门——初识C++(上篇)引用引用的概念和定义引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会......
  • 用for循环输出数组与初识增强for循环
    1.定义一个数组2.使用for循环设置编码3.输出带有编码的数组使用增强for循环输出数组1.依旧是定义数组2.设置一个新的变量x用于替代数组3.直接输出变量x即可......
  • C语言程序设计(初识C语言后部分)
    代码是一门艺术,键盘是我的画笔。3.递归和迭代(循环就是一种迭代,迭代不仅仅是循环)·求n!递归方式:n!--->1(n=1);  n*(n-1)!(n>=1)#include<stdio.h>//n!-->递归方式intfac(intn){ if(n<=1) return1; else returnn*fac(n-1);}intmain(){ int......
  • 初识C语言——练习
    1.求两个数的较大值。   例:输入10、20,输出较大值20。//求两个数的较大值#include<stdio.h>intmain(){ inta=10; intb=20; intc=a>b?a:b; printf("%d\n",c); return0;}2.一个数是否能被5整除问题。  例:输入10,输出yes。//一个数是......
  • 初识指针2の学习笔记
    目录1>>前言2>>野指针2.1>>野指针是如何形成的?2.2>>那么我们如何规避野指针呢?3>>assert断言4>>指针的传地址调用5>>数组名的理解6>>数组and指针的等价打印7>>结语1>>前言    今天我会继续分享一些我做的笔记,以及我对指针的理解,后续会持续分享指针几天,......