Dart 3.2 更新,Flutter Web 的未来越来越明朗

参考原文:https://medium.com/dartlang/dart-3-2-c8de8fe1b91f

本次跟随 Flutter 3.16 发布 的 Dart 3.2 ,包含有:私有 final 字段的非空改进、新的 interop 改进、对 DevTools 中的扩展支持、以及对 Web 路线图的更新,包括对 Wasm 的Web 组件支持。

最重要的就是 Wasm 的Web 组件支持。

private final 的非空类型提升

自 Dart 2.12 发布 sound null safety 以来,类型提升一直是空安全的核心部分之一,但仅限于局部变量里,字段和顶级变量无法处理,例如在这样的情况下会报错:

class Container {final int? _fillLevel;Container(this._fillLevel);check() {if (_fillLevel != null) {int i = _fillLevel; // Prior to Dart 3.2, causes an error.}}
}

这种限制是由于几个复杂的情况造成的,在这些情况下,flow analysis 无法确定字段何时会发生什么变化,例如,在字段提升的情况下,如果子类使用 getter 覆盖字段(有时会返回 null),这就可能会出现问题。

在 Dart 3.2 开始,Dart 改进了 flow analysis ,现在能够归类出 private Final fields

现在 3.2 里上面的代码片段可以顺利通过检测:对于 private & final 的字段,它的值在初始分配后永远不会改变,因此仅检查一次就被认为是安全的。

包中的新代码分析选项:lints 3.0

3.2 还对 package:lints 中的标准代码分析规则进行了一些改进,package 包含了默认和推荐的静态分析规则集,这些规则随 dart createflutter create 创建的新项目一起提供 (通过 package:flutter_lints )。

该 lint 集的主要版本(3.0)目前已经发布,其中向核心集添加了 6 个 lint,向推荐集添加了 2 个 lint,它具有用于验证 pubspec URL、验证是否使用正确参数调用集合方法等相关的 lints 。

有关更改的完整列表,请查看 https://github.com/dart-lang/lints/blob/main/CHANGELOG.md#300, 3.0 版本将成为即将发布的新项目的默认版本。

Dart interop 更新

目前正在努力扩展 Dart interop 以全面支持与 Java 和 Kotlin 和 Objective C 和 Swift 的直接调用支持,从 Dart 3.2 开始进行了许多改进:

  • 引入了 C FFI 的构造函数 NativeCallable.isolateLocal ,它可以从任意 Dart 函数创建一个 C 函数指针,这是 Pointer.fromFunction 提供的功能的扩展,它只能从顶级函数创建函数指针。

  • 更新了 Objective-C 利用NativeCallable.listener 绑定生成器,生成器现在可以自动处理包含异步回调的 API,例如 Core Motion 这种以前需要手动绑定的代码。

  • 改进 package:jnigen 实现 Java 和 Kotlin 的直接调用支持,现在我们能够将 package:cronet_http(Android Cronet HTTP 客户端的包装器)从手写绑定代码迁移到自动生成的包装器。

  • 在 Native Assets 功能上取得了重大进展,该功能旨在解决与依赖于 Native 代码的 Dart 包分发相关的许多问题,它通过提供统一的钩子来与构建 Flutter 和独立 Dart 应用所涉及的各种构建需要,详细可见 :http://dart.dev/guides/libraries/c-interop#native-assets

    Native Assets 目前是一个实验性的功能,它可以让 Dart 包更无缝依赖和使用 Native 代码,通过 flutter run/flutter build dart run/dart build 构建并捆绑 Native 代码 。

    备注:可通过 flutter config --enable-native-assetsflutter create --template=package_ffi [package name] 启用。

    Demo native_add_library 展示了相关使用,当 Flutter 项目依赖 package:native_add_library 时, 脚本会自动在 build.dart 命令上调用:

    import 'package:native_add_library/native_add_library.dart';void main() {print('Invoking a native function to calculate 1 + 2.');final result = add(1, 2);print('Invocation success: 1 + 2 = $result.');
    }
    

Dart 包的 DevTools 扩展

在 Dart 3.2 和 Flutter 3.16 中发布了一个新的扩展框架,该框架让包作者能够为它的 package 构建自定义工具,并直接在 DevTools 中显示。

它允许包含框架的 pub.dev 包提供特定用例的自定义工具,例如 Serverpod 的作者一直在努力为它的 package 构建开发人员工具,并且很高兴在即将发布的 1.2 版本 中提供 DevTools 扩展。

Dart Web 和 Wasm 更新

从 Chrome 119 开始,Chrome 会默认启用 Wasm 垃圾收集支持(称为 Wasm-GC) ,Wasm-GC 支持也出现在 Firefox 120(他们的下一个稳定版本)中被支持,那么 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 interop:一种基于扩展类型的新 JS 互操作机制,当针对 JavaScript 和 Wasm 时,可以在 Dart 代码、浏览器 API 和 JS 库之间进行简洁、类型安全的调用。
  • 支持 Wasm 的浏览器 API:一个新的 package:web,基于现代 JS 互操作机制,取代了 dart:html (和相关库),这将提供对浏览器 API 的更轻松访问,并支持 JS 和 Wasm 目标。

目前已经开始将一些内部项目迁移到 package:web 和新的 JS 互操作机制,并期望在下一个稳定版本中有更多更新。

可以在 https://flutter.dev/wasm 了解更多。

最后

本次更新最重要有两个点,第一就是 Dart interop 越来越成熟,相信以后直接通过 flutter run 就可以完成所有 interop 的绑定和编译,第二就是 Web 路线随着 Dart Wasm 支持的进展,越来越值得期待了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/193694.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决requests库中session.verify参数失效的问题

在使用requests库进行HTTP请求时,如果在环境变量中设置了’REQUESTS_CA_BUNDLE’,并且在session对象中设置了verify参数为False,那么API请求会使用环境变量中的值而不是session对象中的值。这是因为在requests库中,当session对象中…

壹基金爱泽瑞金 安全家园物料配送忙

11月9日到10日,瑞金赋能公益陆续收到壹基金、阿里巴巴公益爱心网友捐赠的社区志愿者救援队队伍物资,马不停蹄地把物资配送到河背街社区、金都社区和沙洲坝镇等项目点,扎实稳妥推进项目有序执行。 在这次物资配送中,志愿者冒雨前行…

DC电源模块对效率有什么要求?

BOSHIDA DC电源模块对效率有什么要求? DC电源模块是现代科技中非常重要的组成部分,它是将交流电转换为直流电的装置,可以提供稳定的电源给各种设备和系统使用。效率是DC电源模块的一个关键性能指标,直接影响着模块的整体性能和效…

ssd202d-logo-cmd_bootlogo分析

cmd_bootlogo.c运行过程 common/autoboot.c:593: disp_logo(0); sprintf(cmd_str, "bootlogo %d 1 0 0 0", logo_id); do_display函数 获取对应结构体,里面有各种参数

Vim 从何而来?

Vim 编辑器的创造者、维护者和终身领导者 Bram Moolenaar 为了纪念这位杰出的荷兰程序员,我们今天来聊一聊 Vim 的历史。 Vim 无处不在。它被很多人使用。同时 Vim 可能是世界上 “最难用的软件之一” ,但是又多次被程序员们评价为 最受欢迎的 代码编辑…

vite动态配置svg图标及其他方式集合

文章目录 前言使用vite-plugin-svg-icons动态配置安装插件引入图标下载新建组件svg-icon.vue使用 使用vue组件动态配置总结如有启发,可点赞收藏哟~ 前言 在配置化的情况下,图标配置也显得极为重要的 使用vite-plugin-svg-icons动态配置 参考vite-plugin…

软件系统集成指南

软件产品集成是将各种软件组件、模块和代码组装成最终可执行、可应用的软件产品的过程。这个过程涉及到将工作产品转化为产品的组装过程。在软件工程中,产品集成是一个重要的环节,通过持续性集成,将产品集成的过程常态化、自动化。做好产品集…

2023 年 数维杯(B题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看数维杯(B题)! …

阿里云的99元服务器和腾讯云的88元云服务器选择哪个?怎么选?

近日,阿里云宣布在2023年双十一优惠活动中推出了一系列降价措施,使得同配置的云服务器比腾讯云更具竞争力。这一消息不仅在云计算领域引起了轰动,更为广大互联网用户提供了更为实惠的选择。 阿里云推出99元一年的服务器,续费价格…

[云原生2.] Kurbernetes资源管理 ---- (陈述式资源管理方式)

1. K8s管理资源的方法类别 1.1 陈述式资源管理方式 主要依赖命令行工具kubectl进行管理 可理解为使用一条命令和参数选项来实现资源的管理操作 1.2 声明式资源管理方式 主要依赖统一资源配置清单进行管理 可以理解为使用yaml配置文件的定义来实现资源的管理操作 1.3 GUI式…

算法-双指针-简单-移动零

记录一下算法题的学习2 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2…

【分享】Excel“只读方式”的两种模式

查阅Excel表格的时候,担心不小心修改了内容,可以给Excel设置以“只读方式”打开,这样就算修改了内容也不能直接保存表格。Excel表格可以设置两种“只读方式”,一起来看看吧! “只读方式” 1: 打开Excel表…

华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯

近日,日经新闻联合研究公司Fomalhaut Techno Solutions对华为 Mate 60 Pro 进行了拆解,揭示了这款于8月发布的新型智能手机的成本结构。拆解结果显示,该手机的国产零部件比例达到了47%,相较于三年前的 Mate 40 Pro,提高…

S25FL256S介绍及FPGA实现思路

本文介绍 S25FL256S 这款 FLASH 芯片,并进行 FPGA 读写控制的实现(编程思路及注意事项)。 文章目录 S25FL-S 介绍管脚功能说明SPI 时钟模式SDRDDR 工作模式FLASH存储阵列(地址空间映射)常用寄存器及相关指令Status Reg…

Android 14 Beta 1

Android 14的第一个 Beta 版,围绕隐私、安全、性能、开发人员生产力和用户定制等核心主题构建,同时继续改进平板电脑、可折叠设备等大屏幕设备的体验。我们一直在完善 Android 14 的功能和稳定性方面取得稳步进展,现在是时候向开发者和早期采…

mysql之搭建MHA架构实现高可用

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换(基于主从复制才能故障切换) MHA最少要求一主两从,半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃,MHA可以在0-30…

Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)

作者:JOE MCELROY 什么是检索增强生成 (RAG) 以及该技术如何通过提供相关源知识作为上下文来帮助提高 LLMs 生成的响应的质量。 生成式人工智能最近取得了巨大的成功和令人兴奋的成果,其模型可以生成流畅的文本、逼真的图像,甚至视频。 就语…

二叉树的创建与遍历

目录 前言: 二叉树的概念与结构 二叉树的链式存储 二叉树的创建 二叉树的销毁 二叉树结点个数计算 二叉树叶子结点个数计算 二叉树第k层节点个数的计算 二叉树高度的计算 二叉树查找值为x的结点 二叉树的遍历 二叉树的前序遍历 二叉树的中序遍历 二叉树…

代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结 文章链接:两个字符串的删除操作、编辑距离、编辑距离总结 视频链接:两个字符串的删除操作、编辑距离 1. LeetCode 583. 两个字符串的删除操作 1.1 思…

计算机编程入门软件,计算机编程初学入门什么语言

计算机编程入门软件,计算机编程初学入门什么语言 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,象如图这个实例就是…