和 Flutter 3.38 一起更新的還有 Dart 3.10 ,同 Flutter 3.38 一樣,Dart 3.10 也帶來比較豐富的更新,其中包括 dot shorthands、Analyzer plugins、Build hooks、Deprecation annotations 和 pub.dev 更新。
Dart 3.10 引入了 dot shorthands,這項新特性允許開發者在編譯器能夠從上下文推斷出類型時,省略冗餘的類名或枚舉名,例如:
enum LogLevel { info, warning, error, debug }
void logMessage(String message, {LogLevel level = LogLevel.info}) {
// ... implementation
}
// Somewhere else in your app
logMessage('Failed to connect to database', level: LogLevel.error);
enum LogLevel { info, warning, error, debug }
void logMessage(String message, {LogLevel level = .info}) {
// ... implementation
}
// Somewhere else in your app
logMessage('Failed to connect to database', level: .error);
Dot shorthands 不僅僅用於枚舉類型,你還可以將它們用於建構函數、靜態方法和靜態字段,例如:
// Use dot shorthand syntax on enums:
enum Status { none, running, stopped, paused }
Status currentStatus = .running; // Instead of Status.running
// Use dot shorthand syntax on a static method:
int port = .parse('8080'); // Instead of int.parse('8080')
// Uses dot shorthand syntax on a constructor:
class Point {
final int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0;
}
Point origin = .origin(); // Instead of Point.origin()
class _PageState extends State<Page> {
late final AnimationController _animationController = .new(vsync: this);
final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();
Map<String, Map<String, bool>> properties = .new();
// ...
}
更多可見:dart.dev/language/do…,這個我們在之前的 《Flutter 合併 'dot-shorthands' 語法糖》也聊過。
Dart 3.10 為 Dart 分析器引入了全新插件系統,開發者現在可以編寫和使用自己的靜態分析規則,並將其直接集成到 IDE 和命令列工具(例如 dart analyze 和 flutter analyze)中,例如:
要使用分析器插件,只需將配置添加到 analysis_options.yaml 文件中即可:
analyzer:
plugins:
- some_plugin
- another_plugin
Analyzer plugins 擴展了 Dart Analyzer的 功能,從而能夠報告自定義信息,診斷功能(包括代碼檢查和警告)提供快速修復方案,並提供輔助功能。
這個我們在之前的 《Flutter 裡的 Asset Transformer 和 Hooks》 我們也聊過,它支援將原生代碼(例如 C++、Rust 或 Swift)集成到 Dart 包中通常需要管理複雜的、特定於平台的構建文件,例如 CMake 或 Gradle,而 Dart 3.10 大大簡化了這一過程。
目前 Build hooks 已經穩定,可以使用 hooks 編譯原生代碼或下載原生資源(例如動態庫),並將它們直接打包到的 Dart 包中。
這項功能讓開發者在包內重用現有的原生代碼或庫,無需為不同的操作系統編寫單獨的構建文件,例如 SPM、Gradle 或 CMake。
example_project/
// Project with hooks.
hook/
// Add hook scripts here.
build.dart
lib/
// Use your assets here.
example.dart
src/
// Add native sources here.
example_native_library.c
example_native_library.h
test/
// Test your assets here.
example_test.dart
Build hooks 在每個包含原生代碼的 Dart 包,會根據 Dart/Flutter 構建系統提供的配置,對包內的原生源代碼(例如 C、C++、Rust 代碼)進行編譯、構建成目標平台可用的 Asset,而這些 Asset 通常是動態連接庫(如 .so、.dll、.dylib)或靜態連接庫(.a、.lib)
也就是可以在插件裡提供原生代碼,然後最終跟隨 App 再編譯成平台庫,這對於原生互操作場景也很重要。
例如下方就是一個簡單的 hook build 示例,其中構建了 3 個原生庫,並且還存在依賴關係:
import 'package:hooks/hooks.dart';
import 'package:logging/logging.dart';
import 'package:native_toolchain_c/native_toolchain_c.dart';
void main(List<String> args) async {
await build(args, (input, output) async {
final logger =
Logger('')..level = Level.ALL..onRecord.listen((record) => print(record.message));
final builders = [
CBuilder.library(
name: 'debug',
assetName: 'debug',
sources: ['src/debug.c'],
),
CBuilder.library(
name: 'math',
assetName: 'math',
sources: ['src/math.c'],
libraries: ['debug'],
),
CBuilder.library(
name: 'add',
assetName: 'add.dart',
sources: ['src/add.c'],
libraries: ['math'],
),
];
// Note: These builders need to be run sequentially because they depend on
// each others output.
for (final builder in builders) {
await builder.run(input: input, output: output, logger: logger);
}
});
}
更多詳細可見:dart.dev/tools/hooks
發布軟體包的新主要版本(例如 1.0.0 或 0.2.0)時,最佳實踐是移除之前標記為已棄用的 API,這可以保持軟體包的整潔,並防止開發人員使用過時的代碼,然而在發布過程中很容易忘記這一步驟。
為了解決這個問題,Dart 3.10 引入了一個新的代碼檢查工具: remove_deprecations_in_breaking_versions ,當軟體包版本更新到新的主要版本時,該工具會檢測遺留的已棄用元素,通過標記這些情況,該工具可以幫助確保軟體包的 API 保持現代化,並易於用戶理解。

現有的 @Deprecated 注解過於簡單粗暴,它雖然告知開發者某個 API 已不再推薦使用,但無法體現細微差別,例如:
如何表明某個類不應再被擴展,但仍然可以被實例化?
為了讓軟體包作者能夠更精確地控制其 API 的演變,Dart 3.10 引入了一套新的、更具體的棄用註釋:
此外,現在可以使用 @Deprecated.optional() 來表明可選參數在未來的版本中將成為必需參數。
在 pub.dev 上管理收藏的軟體包的功能迎來了重大升級,現在可以通過搜尋功能或個人檔案中的 Likes tab 進行管理,可以使用與常規搜尋相同的熟悉控件來搜尋、排序和篩選收藏的軟體包。
排序方式包括按點讚數、pub 積分和受歡迎程度排序,此外還改善了取消收藏軟體包的介面,讓用戶能夠更輕鬆地保持收藏軟體包列表的整潔和最新狀態。

如果選擇使用搜尋功能查找 liked packages,只需在查詢中添加 is:liked-by-me 即可:

另外,為了增強安全性並防止意外發布,現在可以禁用軟體包的手動發布(pub publish)功能,這對於已啟用自動發布工作流程,或不再積極發布的軟體包來說非常理想。
可以在軟體包的 Admin Tab 中使用 “Enable manual publishing” 來控制這個功能:

這次更新,除了誠意滿滿的 Flutter 3.38 之外, Dart 3.10 看起來也是非常不錯,至少為了 Dot shorthands 和 Build hooks 就很值得更新,你覺得呢?