Dart 2.5 正式公布
作者: Michael Thomsen, Dart & Flutter Product Manager, Google
ML Complete,由机器学习 (ML) 驱动的代码补全功能 dart:ffi 外部函数接口,用来直接从 Dart 调用 C 语言代码
常量表达式 https://dart.dev/guides/language/language-tour#final-and-const
热重载 https://flutter.dev/docs/development/tools/hot-reload 可自定义静态分析 https://dart.dev/guides/language/analysis-options Dart DevTools https://flutter.dev/docs/development/tools/devtools/overview
IEEE Spectrum 2019 最佳开发语言 https://spectrum.ieee.org/computing/software/the-top-programming-languages-2019
ML Complete: 基于机器学习的代码补全
用于分析的大量 GitHub 开源 Dart 代码 https://console.cloud.google.com/marketplace/details/github/github-repos TensorFlow Lite https://www.tensorflow.org/lite
如何试用 ML Complete
问题反馈 wiki 页 https://github.com/dart-lang/sdk/wiki/Previewing-Dart-code-completions-powered-by-machine-learning
Flutter dev 渠道
https://github.com/flutter/flutter/wiki/Flutter-build-release-channels
Dart dev 渠道
https://dart.dev/tools/sdk/archive#dev-channel
dart:ffi 外部函数接口
Flutter 功能请求列表 https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc stdlib.h https://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdlib.h.html Win32 https://en.wikipedia.org/wiki/Windows_API
原生扩展 https://dart.dev/server/c-interop-native-extensions 平台通道 https://flutter.dev/docs/development/platform-integration/platform-channels 支持 Dart 的平台和编译器 https://dart.dev/platforms
Dart-C 互操作支持两种主要场景:
在操作系统 (OS) 上调用基于 C 的系统 API
调用基于 C 的代码库,该代码库可以基于单个操作系统,也可以是跨平台的
调用基于 C 的操作系统 API
我们来看看第一个互操作场景。我们将调用 Linux 命令 system,它可以执行任何系统命令; 传递给它的参数实际上是传递给了 shell/terminal,并在那里运行。这个指令的 C 语言头部如下所示:
// C header: int system(const char *command) in stdlib.h
C 语言函数及其参数的类型,以及返回类型 与之对应的 Dart 函数及其类型
// C header typedef:
typedef SystemC = ffi.Int32 Function(ffi.Pointer<Utf8> command);
// Dart header typedef:
typedef SystemDart = int Function(ffi.Pointer<Utf8> command);
// Load `stdlib`. On MacOS this is in libSystem.dylib.
final dylib = ffi.DynamicLibrary.open('/usr/lib/libSystem.dylib');
// Look up the system function.
final systemP = dylib.lookupFunction<SystemC, SystemDart>('system');
macOS 示例 https://github.com/dart-lang/samples/blob/master/ffi/system-command/macos.dart Windows 示例 https://github.com/dart-lang/samples/blob/master/ffi/system-command/windows.dart Linux 示例 https://github.com/dart-lang/samples/blob/master/ffi/system-command/linux.dart
接下来,我们使用与特定操作系统相关的编码对字符串参数进行编码,调用该函数,并再次释放参数内存:
// Allocate a pointer to a Utf8 array containing our command.
final cmdP = Utf8.toUtf8('open http://dart.dev');
// Invoke the command.
systemP(cmdP);
// Free the pointer.
cmdP.free();
△ 通过 dart:ffi 使用系统 API 打开默认浏览器
调用基于 C 的框架和组件
Dart 与 TensorFlow 集成的 repo https://github.com/dart-lang/tflite_native
我们希望调用 C 语言代码库的能力能够对 Flutter 应用带来助力,比如调用 Realm 或 SQLite 等本地代码库,我们认为 dart:ffi 可能会为 Flutter 桌面应用带来强大的插件功能。
Realm
https://github.com/realm/realm-core
SQLite
https://www.sqlite.org/c3ref/intro.html
Flutter 桌面应用
https://github.com/flutter/flutter/wiki/Desktop-shells
封装 API 和代码生成
您可能已经注意到,在互操作时,描述函数/方法和查找符号时会有一些不可避免的前置编程工作。您可以从 C 语言的头文件生成许多这种样板代码。我们目前专注于做好底层的基础工作,如果有任何人对这种代码生成器感兴趣的话,我们也很乐意与之合作。
如何试用 dart:ffi
Flutter master 渠道 https://github.com/flutter/flutter/wiki/Flutter-build-release-channels Dart dev 渠道 https://dart.dev/tools/sdk/archive#dev-channel
该库不支持嵌套结构、内联数组、打包数据或与平台相关的基本类型
指针操作的性能不足 (但可以使用 Pointer.asExternalTypedData 作为替代方案) 该库不支持 finalizer (对象即将被垃圾回收时发生的回调)
dart:ffi 内容规划 https://github.com/dart-lang/sdk/projects/13
我们的 C 语言互操作文档和 dart:ffi API 文档收录了相关的核心概念,并给出了您可以查看的示例。如果您有任何疑问的话,请在 Dart FFI 讨论组中发帖,或直接向我们提交您的问题。
C 语言互操作文档 https://dart.dev/guides/libraries/c-interop dart:ffi API 文档 https://api.dart.dev/dev/2.6.0-dev.1.0/dart-ffi/dart-ffi-library.html Dart FFI 讨论组 https://groups.google.com/forum/#!forum/dart-ffi 向我们提交问题 https://github.com/dart-lang/sdk/issues/new?labels=area-vm,library-ffi
改进常量表达式
// Example: these are now valid compile-time constants.
const Object i = 3;
const list = [i as int];
const set = {if (list is List<int>) ...list};
const map = {if (i is int) i: "int"};
创建常量 https://dart.dev/guides/language/language-tour#final-and-const Dart 2.3 发布说明 https://medium.com/dartlang/announcing-dart-2-3-optimized-for-building-user-interfaces-e84919ca1dff
小结
扩展方法 https://github.com/dart-lang/language/issues/41 非空引用 https://medium.com/dartlang/dart-nullability-syntax-decision-a-b-or-a-b-d827259e34a3 更多语言特性 https://github.com/dart-lang/language/projects/1
默认采用非空引用是一个我们热切期望推进的语言特性。我们为这个特性制定了一个非常庞大的计划,并且正在进行大量工作。最近新出现的几种语言从设计一开始就支持非空引用,而大多数既有语言则在版本更新中也添加了 (有限的) 非空支持,但仅限于额外的静态分析。而我们的目标是实现完全的非空引用,简而言之,这意味着我们的非空将扩展到类型系统的核心,一旦我们的类型系统知道某些东西是非空的,我们就可以完全信任这些信息,并且我们的后端编译器就可以全力优化这些代码。这种稳健性会在很多地方带来优势,比如提供一致的 "无异常报错" 体验,更优化的代码体积以及更高的运行时性能。
非空引用的推进计划 https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/roadmap.md Dart 计划实现完全非空引用 https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/roadmap.md#soundness
当我们改进开发语言时,我们总会意识到这些修改给我们的生态系统带来的负担。因此,我们也在为现有代码提供丰富的迁移工具,并在这方面进行了大量的投入。我们希望这些工具能够抵消大部分迁移成本。我们还添加了一些支持逐步迁移的语言特性和工具,并将努力在 pub.dev 上迁移我们自己的代码和共享代码。
请保持对我们的关注,今年还会有更多惊喜到来!
Flutter 开发者社区中文资源: https://flutter.cn
想了解更多 Flutter 内容?
在公众号首页发送关键词 “Flutter”,获取相关历史技术文章;
还有更多疑惑?欢迎点击菜单 “联系我们” 反馈您在开发过程中遇到的问题。
推荐阅读