头图

哈喽,我是老刘

Flutter 3.24以及Dart 3.5不久前发布了。
突然觉得时间过得好快。六年前刚开始使用Flutter 1.0的场景还在眼前。
image.png

之前写了一篇文章盘点Flutter 3.24的新功能对普通开发者有哪些影响。
Flutter 3.24 对普通开发者有哪些影响?
本文站在编程语言的角度,单独看看Dart 3.5的新功能有哪些是我们普通开发者会用到的。

Web 平台和 JS 互操作性

这个功能是为了将 Flutter Web 应用编译为 WebAssembly 服务的。
从Dart 3.5开始这个功能从预览进入稳定版。

官方计划在下一个 Dart 版本中弃用旧的互操作 API (dart:html、dart:js、package:js 等),并在明年晚些时候完全停止支持它们。
也就是说大家都应该尽快迁移到新的web库:package:web 。
image.png

从Flutter for web的长期路线图来看 WebAssembly 会是未来Flutter在Web端的唯一方案。

Dart 原生互操作性

Dart 原生互操作性得到改进,可以直接调用 C、Java、Kotlin、Objective-C 和 Swift。

  • C 互操作通过 FFI 库实现,

    • Dart 3.5 版本中增加了直接传递 Dart TypedData 对象指针给 FFI 的功能,减少了内存复制。
  • Java 和 Kotlin 互操作通过 JNIgen 生成器实现,支持了性能改进和对 Java 异常及 Kotlin 顶级函数的支持。
    image.png
  • Objective-C 互操作基于 FFI 和 FFIgen 生成器,增加了对 Objective-C 协议和常见类型(如 NSString)的支持。
  • 未来版本将继续投资于互操作性,包括完善现有库和支持 Swift。

原先在Flutter中是通过Flutter的channel来实现Dart代码与原生通信的。
但是这种方式终究需要通过原生应用的壳中转一层,运行效率、开发效率和灵活性都受到了影响。
比如在Windows系统上想调用Java的功能,只能先通过channel调用到原生的C++代码,然后再通过C++调用Java。
现在则可以直接在Dart中调用Java的相关功能。

当然这个功能也会带来一些架构上的复杂度。
比如原先所有的原生调用都是走channel的,从架构上看非常清晰。日志、调试等方面也很统一方便。
后续这种统一性被打破,可能会带来一些原先没有的复杂度提升,这一点需要开发者统筹考量了。

官方消息说:Dart 语言和编译器团队目前的大部分时间都花在推进非常大的语言特性宏上。
宏是我非常关注的一个语言特性。
老刘早年是做网络安全的,使用的编程语言是c,平台是基于linux内核定制的系统。
我们当时的命令行体系非常复杂,一条普通的配置命令动辄十几个关键字。
因此当时的命令行系统就是基于c语言的宏开发的一套专门的DSL。
而且因为我们同时支持x86、mips和arm多种cpu,也基于宏定制了很多编译期针对不同cpu体系的差异化编译过程。
image.png

所以宏绝对是一个为编程语言打开一片全新世界的利器。
当然,宏带来的复杂度提升也绝对是把bug的复杂度提升到了新的维度。
所以这绝对是一个非常强大但是一个用不好就自损三千的武器,只能说运用之妙存乎一心了。

另外从官方的消息中能看出两个信息来:
1、Dart不是只为Flutter服务的,投入如此大的资源在宏这种语言特性上,其所图非小。
2、投入大量的资源在这种短期看不到任何收益的内容上,可以看出团队有很长远的长期规划。那么还在担心Flutter会不会哪天就被放弃的同学,应该可以暂时放心了。

总结

Dart 3.5 站在整个Dart语言的发展路径上看不是特别重要的版本。
但是未来比较重大的变化在这个版本上都有体现,因此可以让我们对整个语言的发展趋势有清晰的了解。
1、完善面向底层系统的兼容能力
Dart在持续补完语言层面和运行平台间的互操作能力,包括C、Java、Kotlin、Objective-C 和 Swift这样的系统级平台语言,也包括web上的js互操作。
这一方面为Flutter提供了更多的便利性和可能性,另一方面也为Dart语言超越Flutter的范畴,成为真正意义上的通用跨平台语言提供了可靠的保证。
比如我们使用Dart编写一些命令行工具,如果需要用到视频编解码、文件加解密之类的功能,就可以通过FFI调用现成的so库。如果需要调用系统功能,也可以通过原生互操作完成系统调用。

2、提供面向开发者的多种抽象能力
这一点主要是通过来实现的。
我们目前工程界常用的编程语言要么面向过程,比如c。
要么面向对象,比如Java、OC。
要么在面向对象中加入对函数式编程的支持,比如Kotlin。
但是不管哪一种,语言所提供的抽象方式都已经固定下来了。
但是如果能提供类似c/c++的宏功能。
开发者就可以针对具体的项目场景定义针对性的DSL。

如果前面说的向上和向下的两部分语言特性都能完全打通。
我们完全可以基于Dart实现很多非常庞大的系统。
比如向下突破语言性能和功能的限制,基于原生互操作实现高性能要求的功能如视频剪辑、硬件调用。完成底层系统差异的封装。
中间基于Dart实现我们的业务逻辑。
向上为其它开发者、甚至非程序员提供领域专用的DSL接口。
比如为测试人员提供专用的测试接口,帮助他们完成系统的自动化测试。

好了,以上是对Dart 3.5功能的盘点和未来发展的一些展望。
不过至少到目前为止Dart还主要是为Flutter开发者服务的。
对于Flutter开发者来说,Dart能做到的事情越多,我们0学习成本能开发的东西就越多,所以未来可期。
如果看到这里的同学有学习Flutter的兴趣,欢迎联系老刘,我们互相学习。
点击免费领老刘整理的《Flutter开发手册》,覆盖90%应用开发场景。
可以作为Flutter学习的知识地图。
覆盖90%开发场景的《Flutter开发手册》


程序员老刘
1 声望2 粉丝

客户端架构师,客户端团队负责人。一个月带领客户端团队从0基础迁移到Flutter 。目前团队已使用Flutter五年。