Dart是开发人员喜欢Flutter的一大原因。如以下推文

@flutterio got me to look at @dart, and I’m glad I took it for a spin. #Dart is an awesome language, and #flutterio takes it even further, to mobile devices < 3

以下是使Dart成为Flutter不可或缺的一部分的特性:

  • Dart是AOT(Ahead Of Time)编译的,编译成快速、可预测的本地代码,使Flutter几乎都可以使用Dart编写。这不仅使Flutter变得更快,而且几乎所有的东西(包括所有的小部件)都可以定制。
  • Dart也可以JIT(Just In Time)编译,开发周期异常快,工作流颠覆常规(包括Flutter流行的亚秒级有状态热重载)。
  • Dart可以更轻松地创建以60fps运行的流畅动画和转场。Dart可以在没有锁的情况下进行对象分配和垃圾回收。就像JavaScript一样,Dart避免了抢占式调度和共享内存(因而也不需要锁)。由于Flutter应用程序被编译为本地代码,因此它们不需要在领域之间建立缓慢的桥梁(例如,JavaScript到本地代码)。它的启动速度也快得多。
  • Dart使Flutter不需要单独的声明式布局语言,如JSX或XML,或单独的可视化界面构建器,因为Dart的声明式编程布局易于阅读和可视化。所有的布局使用一种语言,聚集在一处,Flutter很容易提供高级工具,使布局更简单。
开发人员发现Dart特别容易学习,因为它具有静态和动态语言用户都熟悉的特性。

并非所有这些功能都是Dart独有的,但它们的组合却恰到好处,使Dart在实现Flutter方面独一无二。因此,没有Dart,很难想象Flutter像现在这样强大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文接下来将深入探讨使Dart成为实现Flutter的最佳语言的许多特性(包括其标准库)。

编译和执行

[如果你已经了解静态语言与动态语言、AOT与JIT编译以及虚拟机等主题,可以跳过本节。]

历史上,计算机语言分为两组:静态语言(例如,Fortran和C,其中变量类型是在编译时静态指定的)和动态语言(例如,Smalltalk和JavaScript,其中变量的类型可以在运行时改变)。静态语言通常编译成目标机器的本地机器代码(或汇编代码)程序,该程序在运行时直接由硬件执行。动态语言由解释器执行,不产生机器语言代码。

当然,事情后来变得复杂得多。虚拟机(VM)的概念开始流行,它其实只是一个高级的解释器,用软件模拟硬件设备。虚拟机使语言移植到新的硬件平台更容易。因此,VM的输入语言常常是中间语言。例如,一种编程语言(如Java)被编译成中间语言(字节码),然后在VM(JVM)中执行。

另外,现在有即时(JIT)编译器。JIT编译器在程序执行期间运行,即时编译代码。原先在程序创建期间(运行时之前)执行的编译器现在称为AOT编译器

一般来说,只有静态语言才适合AOT编译为本地机器代码,因为机器语言通常需要知道数据的类型,而动态语言中的类型事先并不确定。因此,动态语言通常被解释或JIT编译。

在开发过程中AOT编译,开发周期(从更改程序到能够执行程序以查看更改结果的时间)总是很慢。但是AOT编译产生的程序可以更可预测地执行,并且运行时不需要停下来分析和编译。AOT编译的程序也更快地开始执行(因为它们已经被编译)。

相反,JIT编译提供了更快的开发周期,但可能导致执行速度较慢或时快时慢。特别是,JIT编译器启动较慢,因为当程序开始运行时,JIT编译器必须在代码执行之前进行分析和编译。研究表明,如果开始执行需要超过几秒钟,许多人将放弃应用

以上就是背景知识。将AOT和JIT编译的优点结合起来不是很棒吗?请继续阅读。

编译与执行Dart

在创造Dart之前,Dart团队成员在高级编译器和虚拟机上做了开创性的工作,包括动态语言(如JavaScript的V8引擎和Smalltalk的Strongtalk)以及静态语言(如用于Java的Hotspot编译器)。他们利用这些经验使Dart在编译和执行方面非常灵活。

Dart是同时非常适合AOT编译和JIT编译的少数语言之一(也许是唯一的“主流”语言)。支持这两种编译方式为Dart和(特别是)Flutter提供了显著的优势。

JIT编译在开发过程中使用,编译器速度特别快。然后,当一个应用程序准备发布时,它被AOT编译。因此,借助先进的工具和编译器,Dart具有两全其美的优势:极快的开发周期、快速的执行速度和极短启动时间。

Dart在编译和执行方面的灵活性并不止于此。例如,Dart可以编译成JavaScript,所以浏览器可以执行。这允许在移动应用和网络应用之间重复使用代码。开发人员报告他们的移动和网络应用程序之间的代码重用率高达70%。通过将Dart编译为本地代码,或者编译为JavaScript并将其与node.js一起使用,Dart也可以在服务器上使用。

最后,Dart还提供了一个独立的虚拟机(本质上就像解释器一样),虚拟机使用Dart语言本身作为其中间语言。

Dart可以进行高效的AOT编译或JIT编译、解释或转译成其他语言。Dart编译和执行不仅非常灵活,而且速度特别快。

下一节将介绍Dart编译速度的颠覆性的例子。

有状态热重载

Flutter最受欢迎的功能之一是其极速热重载。在开发过程中,Flutter使用JIT编译器,通常可以在一秒之内重新加载并继续执行代码。只要有可能,应用程序状态在重新加载时保留下来,以便应用程序可以从停止的地方继续。

除非自己亲身体验过,否则很难理解在开发过程中快速(且可靠)的热重载的重要性。开发人员报告称,它改变了他们创建应用的方式,将其描述为像将应用绘制成生活一样。

以下是一位移动应用程序开发人员对Flutter热重载的评价

我想测试热重载,所以我改变了颜色,保存修改,结果……就喜欢上它了❤!

这个功能真的很棒。我曾认为Visual Studio中编辑和继续(Edit & Continue)很好用,但这简直令人惊叹。有了这个功能,我认为移动开发者的生产力可以提高两倍。

这对我来说真的是翻天覆地的变化。当我部署代码并花费很长时间时,我分心了,做了其他事情,当我回到模拟器/设备时,我就忘了想测试的内容。有什么比花5分钟将控件移动2px更令人沮丧?有了Flutter,这不再存在。

Flutter的热重载也使得尝试新想法或尝试替代方案变得更加容易,从而为创意提供了巨大的推动力。

到目前为止,我们讨论了Dart给开发人员带来的好处。下一节将介绍Dart如何使创建满足用户需求的顺畅的应用程序更加轻松。

避免卡顿

应用程序速度快很不错,但流畅则更加了不起。即使是一个超快的动画,如果它不稳定,也会看起来很糟糕。但是,防止卡顿可能很困难,因为因素太多。Dart有许多功能可以避免许多常见的导致卡顿的因素。

当然,像任何语言一样,Flutter也可能写出来卡顿的应用程序;Dart通过提高可预测性,帮助开发人员更好地控制应用程序的流畅性,从而更轻松地提供最佳的用户体验。

效果怎样呢?

以60fps运行,使用Flutter创建的用户界面的性能远远优于使用其他跨平台开发框架创建的用户界面。

不仅仅比跨平台的应用程序好,而且和最好的原生应用程序一样好:

UI像黄油一样顺滑……我从来没有见过这样流畅的Android应用程序。

AOT编译和“桥”

我们讨论过一个有助于保持顺畅的特性,那就是Dart能AOT编译为本地机器码。预编译的AOT代码比JIT更具可预测性,因为在运行时不需要暂停执行JIT分析或编译。

然而,AOT编译代码还有一个更大的优势,那就是避免了“JavaScript桥梁”。当动态语言(如JavaScript)需要与平台上的本地代码互操作时,它们必须通过桥进行通信,这会导致上下文切换,从而必须保存特别多的状态(可能会存储到辅助存储)。这些上下文切换具有双重打击,因为它们不仅会减慢速度,还会导致严重的卡顿。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:即使编译后的代码也可能需要一个接口来与平台代码进行交互,并且这也可以称为桥,但它通常比动态语言所需的桥快几个数量级。另外,由于Dart允许将小部件等内容移至应用程序中,因此减少了桥接的需求。

抢占式调度、时间分片和共享资源

大多数支持多个并发执行线程的计算机语言(包括Java、Kotlin、Objective-C和Swift)都使用抢占式来切换线程。每个线程都被分配一个时间分片来执行,如果超过了分配的时间,线程将被上下文切换抢占。但是,如果在线程间共享的资源(如内存)正在更新时发生抢占,则会导致竞态条件

竞态条件具有双重不利,因为它可能会导致严重的错误,包括应用程序崩溃并导致数据丢失,而且由于它取决于独立线程的时序,所以它特别难以找到并修复。在调试器中运行应用程序时,竞态条件常常消失不见。

解决竞态条件的典型方法是使用来保护共享资源,阻止其他线程执行,但锁本身可能导致卡顿,甚至更严重的问题(包括死锁饥饿)。

Dart采取了不同的方法来解决这个问题。Dart中的线程称为isolate,不共享内存,从而避免了大多数锁。isolate通过在通道上传递消息来通信,这与Erlang中的actor或JavaScript中的Web Worker相似。

Dart与JavaScript一样,是单线程的,这意味着它根本不允许抢占。相反,线程显式让出(使用async/await、FutureStream)CPU。这使开发人员能够更好地控制执行。单线程有助于开发人员确保关键功能(包括动画和转场)完成而无需抢占。这通常不仅是用户界面的一大优势,而且还是客户端——服务器代码的一大优势。

当然,如果开发人员忘记了让出CPU的控制权,这可能会延迟其他代码的执行。然而我们发现,忘记让出CPU通常比忘记加锁更容易找到和修复(因为竞态条件很难找到)。

对象分配和垃圾回收

另一个严重导致卡顿的原因是垃圾回收。事实上,这只是访问共享资源(内存)的一种特殊情况,在很多语言中都需要使用锁。但在回收可用内存时,锁会阻止整个应用程序运行。但是,Dart几乎可以在没有锁的情况下执行垃圾回收。

Dart使用先进的分代垃圾回收和对象分配方案,该方案对于分配许多短暂的对象(对于Flutter这样的反应式用户界面来说非常完美,Flutter为每帧重建不可变视图树)都特别快速。Dart可以用一个指针凹凸分配一个对象(不需要锁)。这也会带来流畅的滚动和动画效果,而不会出现卡顿。

统一的布局

Dart的另一个好处是,Flutter不会从程序中拆分出额外的模板或布局语言,如JSX或XML,也不需要单独的可视布局工具。以下是一个简单的Flutter视图,用Dart编写:

new Center(child:

new Column(children: [

new Text(‘Hello, World!’),

new Icon(Icons.star, color: Colors.green),

])

)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dart编写的视图及其效果

注意,可视化这段代码产生的效果是多么容易(即使你没有使用Dart的经验)。

Dart 2即将发布,这将变得更加简单,因为new和const关键字变得可选,所以静态布局看起来像是用声明式布局语言编写的:

Center(child:

Column(children: [

Text(‘Hello, World!’),

Icon(Icons.star, color: Colors.green),

])

)

然而,我知道你可能在想什么——缺乏专门的布局语言怎么会被称为优势呢?但它确实是颠覆性的。以下是一名开发人员在一篇题为“为什么原生应用程序开发人员应认真看待Flutter”的文章中写的内容。

在Flutter里,界面布局直接通过Dart编码来定义,不需要使用XML或模板语言,也不需要使用可视化设计器之类的工具。

说到这里,大家可能会一脸茫然,就像我当初的反应一样。使用可视化工具不是更容易吗?如果把所有的逻辑都写到代码里不是会让事情变复杂吗?

结果不然。天啊,它简直让我大开眼界。

首先是上面提到的热重载。

这比Android的Instant Run和任何类似解决方案不知道要领先多少年。对于大型的应用同样适用。如此快的速度,正是Dart的优势所在。

实际上,可视化编辑器就变得多余了。我一点都不怀恋XCode的自动重布局。

Dart创建的布局简洁且易于理解,而“超快”的热重载可立即看到结果。这包括布局的非静态部分。

结果,在Flutter中进行布局要比在Android/XCode中快得多。一旦你掌握了它(我花了几个星期),由于很少发生上下文切换,因此会节省大量的开销。不必切换到设计模式,选择鼠标并开始点击,然后想是否有些东西必须通过编程来完成,如何实现等等。因为一切都是程序化的。而且这些API设计得非常好。它很直观,并且比自动布局XML更强大。

例如,下面是一个简单的列表布局,在每个项目之间添加一个分隔线(水平线),以编程方式定义:

return new ListView.builder(itemBuilder: (context, i) {

if (i.isOdd) return new Divider();

// rest of function

});

​​​​​​​在Flutter中,无论是静态布局还是编程布局,所有布局都存在于同一个位置。新的Dart工具,包括Flutter Inspector和大纲视图(利用所有的布局定义都在代码里)使复杂而美观的布局更加容易。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

目前已经更新的部分资料:



《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

!(备注:Android)**

最后

目前已经更新的部分资料:

[外链图片转存中…(img-sGHoq4lh-1712906371180)]
[外链图片转存中…(img-ZIKgef3O-1712906371181)]
[外链图片转存中…(img-wpINZ7Ms-1712906371181)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐