Dart 3.2 更新盘点

作者 / Kevin Moore 和 Michael Thomsen
我们隆重宣布推出 Dart 3.2,这一版本针对以下方面做出了改进: 新增了一项语言功能,可对私有 final 字段进行非空升级;通过新增的互操作功能改善了开发者体验;支持 DevTools 的扩展程序;并更新了我们的 Web 路线图,包括提供对 Wasm (又名 WebAssembly) 的支持。
私有 final 字段的非空升级
自我们在 Dart 2.12 中引入 健全的空安全 (sound null safety) 以来已过去几年时间。您可以借助空安全声明哪些类型可为空 (可以包含值或 null),哪些类型不可为空 (始终包含值)。通过将空安全与 流程分析 相结合,能够检测何时可以将可为空的变量 "升级" 为更安全的非空类型:
int definitelyInt(int? aNullableInt) {
if (aNullableInt == null) {
return 0;
}
// If flow analysis reaches this point,
// aNullableInt can safely promote to a non-null int.
return aNullableInt;
}
自 Dart 2.12 发布以来,类型升级一直是空安全的核心部分,但仅限于局部变量。字段或顶级变量无法升级,例如以下代码示例:
class Container {
final int? _fillLevel;
Container(this._fillLevel);
check() {
if (_fillLevel != null) {
int i = _fillLevel; // Prior to Dart 3.2, causes an error.
}
}
}
这种局限性由多种复杂的情况导致。在这些情况中,流程分析无法安全地确定字段何时或如何变化。以类上的字段升级为例,如果子类使用 getter 覆盖字段,可能会存在问题,因为有时会返回 null。
在 Dart 3.2 中,我们改进了流程分析引擎,现在能够对私有 final 字段实施类型升级。现在,上面的代码示例可以正常运行。您可以这样理解: 对于私有 final 字段,它的值在初始分配后永不更改,因此仅检查一次也是安全的。私有 final 字段升级从 Dart 3.2 起推出,并将应用于配置 3.2 及以上版本 Dart SDK 的项目。
在 package:lints 3.0 中加入新的代码分析选项
针对代码分析,我们还对 package:lints 中的标准代码分析规则进行了一些改进。此 package 包含默认和推荐的静态分析规则集,适用于任何根据 dart create 或 flutter create (通过 package:flutter_lints — package:lints 的扩展) 创建的新项目。
此 lint 集新的主要版本 (版本 3.0) 现已推出。我们在此修订版的核心集中添加了六个 lint,在推荐集中添加了两个 lint,可用于验证 pubspec URL,以及验证是否使用正确的参数调用集合方法等。您可以查看 更新日志 获取完整的更改列表。3.0 版本将成为即将发布的新项目的默认版本。您也可以 立即升级 现有项目。
Dart 互操作性更新
提供 广泛的跨平台支持 一直是 Dart 的核心原则。但是,即使一行 Dart 代码可以做到无需更改就能在所有平台上运行,大型应用通常仍然需要与现有代码进行互操作。现有代码指旧项目的代码,或其他库中可用的 API 或系统 API。我们在这一领域投入了大量精力,首先是用于 与原生 C API 进行互操作 的 FFI。我们目前正在努力扩大该领域,以支持与 Java、Kotlin、Objective C 和 Swift 的互操作。您可以阅读下文 Dart Web 部分,了解有关 JS 互操作性的精彩更新。
从 Dart 3.2 开始,我们对原生互操作进行了许多改进:
我们为 C FFI 引入了 NativeCallable.isolateLocal 构造函数,它可以根据任意 Dart 函数创建 C 函数指针。这是一项由 Pointer.fromFunction 提供的扩展功能,只能根据顶级函数创建函数指针。
我们更新了 Objective-C 绑定生成器,以使用在 Dart 3.1 中添加的 NativeCallable.listener。该生成器现在可以自动处理包含异步回调的 API,例如 Core Motion 这类此前需要手动编写部分绑定代码的 API。
我们为实现 Java 和 Kotlin 互操作而持续改进 package:jnigen。现在能够将 package:cronet_http (适用于 Android 的 Cronet HTTP 客户端的封装容器) 从手写的绑定代码迁移到 自动生成的封装容器。
我们在 Native Assets 功能方面取得了重大进展,该功能旨在解决与依赖原生代码的 Dart package 分发相关的许多问题。Native Assets 提供统一的钩子来集成构建 Flutter 和独立 Dart 应用所涉及的各种构建系统,从而解决相关问题。您可以查看相关 文档 获取预览。
适用于 Dart package 的 DevTools 扩展程序
Dart DevTools 是一套用于支持纯 Dart 和 Flutter 应用的调试及性能工具。我们在 Dart 3.2 和 Flutter 3.16 中 推出 了新的 扩展框架,让 package 作者能够直接在 DevTools 中为其 package 构建自定义工具。因此,包含框架的 pub.dev package 能够提供特定于其用例的自定义工具。例如,Serverpod 的作者一直在努力为其 package 构建 DevTools,并且很高兴在即将发布的 1.2 版本 中提供 DevTools 扩展程序。

△ 计划纳入即将发布的 ServerPod 1.2 版本中的 DevTools 扩展程序
Dart Web 和 Wasm 更新
Wasm (也称为 WebAssembly) 是一种在 Web 浏览器上非常棒的新指令格式,还提供可移植、独立于平台的二进制格式,以适用于现代浏览器。我们正在将高级托管语言 (如 Dart) 的垃圾回收功能添加到 Wasm 标准中。从 Chrome 119 开始默认启用 Wasm 的垃圾回收支持 (也称为 Wasm-GC)。下一个稳定版本 Firefox 120 也将支持 Wasm-GC。那么 Dart、Flutter 和 Wasm-GC 现在是什么情况呢?
Dart-to-Wasm 编译器几乎配备所有功能。我们对性能和兼容性非常满意,正在进一步关注边缘情况,以确保在各种场景中实现畅快运行。
对于 Flutter Web,我们完成了一个新的 "Skwasm" 渲染引擎开发。为了最大限度提高性能,Skwasm 通过 wasm-to-wasm 绑定,将编译后的应用代码直接连接到自定义 CanvasKit Wasm 模块。这是 Flutter Web 多线程渲染支持的首次迭代,进一步提高了帧时间。
在采用 Wasm 的 Flutter Web 准备结束目前的实验状态之前,我们还有一些事情要做:
- 双重编译 : 生成 Wasm 和 JavaScript 输出,并在运行时启用功能检测,以支持具备或不具备 Wasm-GC 支持的浏览器。
- 现代 JavaScript 互操作性 : 一种新的基于 扩展类型 的 JS 互操作机制,当针对 JavaScript 和 Wasm 时,可以在 Dart 代码、浏览器 API 和 JS 库之间实现简洁的、类型安全的调用。
- 支持 Wasm 的浏览器 API : 新的 package:web,基于现代 JS 互操作机制,取代了 dart:html (及相关库),借此可轻松访问浏览器 API,并且支持在 JS 和 Wasm 目标上使用。
我们正在开始将大量的内部项目迁移到 package:web 和新的 JS 互操作机制,并希望在下一个稳定版本中向您提供更多更新。与此同时,您可以在我们的 WebAssembly 支持 页面上获取最新的详细信息。
开始体验
以上就是我们要与您分享的所有内容。Dart 3.2 现已在 dart.dev 中推出,您也可以通过我们将在后续介绍的 Flutter 3.16 版本使用此产品。尽情体验新版 Dart 吧!
Dart 3.2 更新盘点的更多相关文章
- Sky(dart)语言介绍-android学习之旅(十)
认识dart语言 google于2011年10月10日发布了"dart"语言的"早起预览版",google希望利用这款语言,帮助开发者克服javaScript的 ...
- 一起看 I/O | Flutter 3 更新详解
作者 / Kevin Jamaul Chisholm, Technical Program Manager for Dart and Flutter at Google 又到了 Flutter 稳定版 ...
- 在后台业务管理系统中使用Autofac实现微信接口的处理
在后台业务管理系统中使用Autofac实现微信接口的处理,我们只需要把相关使用到的DLL放到BIN目录里面即可,通过IOC控制反转方式实现对接口的调用.在实现在业务系统里面,我们本身程序可能已经依赖了 ...
- fir.im Weekly - iOS / Android 动态化更新方案盘点
动态化更新是 App 开发必然面对的问题.在 iOS 环境下,Apple 开发者们像是" 带着手铐脚镣跳舞" ,相比之下 Android 开发者会轻松一点,有很多相关的开源框架帮助 ...
- 盘点 React 16.0 ~ 16.5 主要更新及其应用
目录 0. 生命周期函数的更新 1. 全新的 Content API 2. React Strict Mode 3. Portal 4. Refs 5. Fragment 6. 其他 7. 总结 生命 ...
- 那些年我们装过的数据库---盘点sqlserver2008安装时遇到的各种的问题(持续更新中)
给自己安过sqlServer2008,也给好多同学安过sqlServer2008,期间遇到了好多不同的另人心烦的问题,在这里整理一下,(涉及到的部分方法是在网上找的,有些也没试过,仅仅是在这里整理一下 ...
- 最火移动端跨平台方案盘点:React Native、weex、Flutter
1.前言 跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头. ...
- 一文读懂前端技术演进:盘点Web前端20年的技术变迁史
本文原文由作者“司徒正美”发布于公众号“前端你别闹”,即时通讯网收录时有改动,感谢原作者的分享. 1.引言 1990 年,第一个Web浏览器的诞生:1991 年,WWW诞生,这标志着前端技术的开始. ...
- fir.im Weekly - 热门 iOS 第三方库大盘点
本期 fir.im Weekly 收集的热度资源,大部分关于Android.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内程序员不常用的热门iOS第三方库 ...
- mybatis3批量更新 批量插入
在公司ERP项目开发中,遇到批量数据插入或者更新,因为每次连接数据库比较耗时,所以决定改为批量操作,提升效率.库存盘点导入时,需要大量数据批量操作. 1:数据库连接代码中必须开启批量操作.加上这句,& ...
随机推荐
- Solution Set -「CF 1514」
「CF 1514A」Perfectly Imperfect Array Link. 就看序列中是否存在不为平方数的元素即可. #include<bits/stdc++.h> using n ...
- 利用python将数据写入CSV文件中
利用python将数据写入CSV文件中 全部代码如下: import csv # 1.创建文件对象 f = open('cav_file.csv', 'w', encoding='utf-8', ne ...
- 前端三件套系例之HTML——HTML文档结构、文档声明、主体结构标签、HEAD头部标签、meta元信息、Body内常用标签、6 其他了解
文章目录 HTML文档结构 1. 文档声明 2.主体结构标签 3.HEAD头部标签 4.meta元信息 5 Body内常用标签 5.1 基本标签(块级标签和内联标签) 5.2 div标签和span标签 ...
- linux常用命令(六)
用于查找系统文件的相关命令 grep find locate grep:查找文件中符号条件的字符串(关键词) 命令语法:grep [选项] 查找模式 [文件名] 选项 选项含义 -E 模式是一个可扩展 ...
- CSS 多行文本超链接下划线动效
先看效果 乍一看,是不是感觉很简单,仔细一瞅发现事情好像没有那么简单. 如果十分钟还没想出怎么实现,那就把简历上的"精通css"改成"了解css"-- 大部分人 ...
- 算法修养--A*寻路算法
A*寻路算法 广度优先算法 广度优先算法搜索以广度做未优先级进行搜索. 从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点. 这种算法就像洪水(Flo ...
- 虹科喜报 | 虹科技术工程师【国内首批】拿下Redis认证开发者证书!
要说虹科数据库技术工程师有多强悍,认证考试2022年12月上线,次年2月就以全国首批速度强势通过考试,并于两周后正式收到[Redis认证开发人员]证书! 虹科小云忍不住浅浅炫耀一下: 或许大家对Red ...
- SpringBoot自动配置原理解析
1: 什么是SpringBoot自动配置 首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发 ...
- Java初始化顺序及使用Spring情况下初始化
Java初始化顺序 1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out. ...
- [Python急救站课程]叠加等边三角形的绘制
叠加等边三角形的绘制 from turtle import * penup() fd(-100) pendown() pensize(10) seth(60) fd(200) seth(-60) fd ...