🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

Dart 3.10 發布,快來看看有什麼更新吧

Flutter 3.38 一起更新的還有 Dart 3.10 ,同 Flutter 3.38 一樣,Dart 3.10 也帶來比較豐富的更新,其中包括 dot shorthands、Analyzer plugins、Build hooks、Deprecation annotations 和 pub.dev 更新。

Dot shorthands

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' 語法糖》也聊過。

Analyzer plugins

Dart 3.10 為 Dart 分析器引入了全新插件系統,開發者現在可以編寫和使用自己的靜態分析規則,並將其直接集成到 IDE 和命令列工具(例如 dart analyzeflutter analyze)中,例如:

  • 強制執行專案特定的規則,例如定制的代碼檢查和警告,以維護團隊代碼庫中的規範
  • 避免常見陷阱,並遵循開發者所在領域的最佳實踐
  • 通過提供快速修復和輔助功能,實現代碼更改自動化,從而幫助自動糾正問題或遷移到新的 API

要使用分析器插件,只需將配置添加到 analysis_options.yaml 文件中即可:

analyzer:
  plugins:
    - some_plugin
    - another_plugin

Analyzer plugins 擴展了 Dart Analyzer的 功能,從而能夠報告自定義信息,診斷功能(包括代碼檢查和警告)提供快速修復方案,並提供輔助功能。

詳細可見:dart.dev/tools/analy…

Build hooks

這個我們在之前的 《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

移除棄用項 lint

發布軟體包的新主要版本(例如 1.0.0 或 0.2.0)時,最佳實踐是移除之前標記為已棄用的 API,這可以保持軟體包的整潔,並防止開發人員使用過時的代碼,然而在發布過程中很容易忘記這一步驟。

為了解決這個問題,Dart 3.10 引入了一個新的代碼檢查工具: remove_deprecations_in_breaking_versions ,當軟體包版本更新到新的主要版本時,該工具會檢測遺留的已棄用元素,通過標記這些情況,該工具可以幫助確保軟體包的 API 保持現代化,並易於用戶理解。

image

Deprecated annotation

現有的 @Deprecated 注解過於簡單粗暴,它雖然告知開發者某個 API 已不再推薦使用,但無法體現細微差別,例如:

如何表明某個類不應再被擴展,但仍然可以被實例化?

為了讓軟體包作者能夠更精確地控制其 API 的演變,Dart 3.10 引入了一套新的、更具體的棄用註釋:

此外,現在可以使用 @Deprecated.optional() 來表明可選參數在未來的版本中將成為必需參數。

Pub 更新

在 pub.dev 上管理收藏的軟體包的功能迎來了重大升級,現在可以通過搜尋功能或個人檔案中的 Likes tab 進行管理,可以使用與常規搜尋相同的熟悉控件來搜尋、排序和篩選收藏的軟體包。

排序方式包括按點讚數、pub 積分和受歡迎程度排序,此外還改善了取消收藏軟體包的介面,讓用戶能夠更輕鬆地保持收藏軟體包列表的整潔和最新狀態。

image

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

image

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

可以在軟體包的 Admin Tab 中使用 “Enable manual publishing” 來控制這個功能:

image

最後

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


原文出處:https://juejin.cn/post/7571693273728942116


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝14   💬4   ❤️4
451
🥈
我愛JS
📝1   💬3   ❤️2
46
🥉
酷豪
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付