Announcing Dart 3.9【日本語訳】

訳者 はじめに

FltuterとDartの3ヶ月ごとのバージョンアップに対してブログ記事がありますので、そちらの日本語訳をさせていたただいております。誤訳・改善点があればご連絡いただけると助かります。
Amanda Fitchさんによる「Announcing Dart 3.9」(原文)の日本語訳です。

はじめに

こんにちは、Dart開発者の皆様!最新の安定版、Dart 3.9が正式にリリースされました!

今回のリリースは、皆様の作業を効率化し、アプリケーションのパフォーマンスを向上させることに焦点を当てています。null安全性の重要な更新、Dart CLIのパフォーマンス向上、そしてAIアシスタントの強化を可能にするDartとFlutter MCP Serverの追加など、多くの新機能が含まれています。Dart 3.9のすべての新機能について、以下で詳しくご覧ください。

Announcing Dart 3.9

Dart 3.9 の発表

言語のアップデート

Null Safety

Dart 3.9 は、型変換、到達可能性、確定割り当ての計算時にNull Safetyを仮定します。これらの改善を活用するには、パッケージのSDK制約の下限を3.9以降(sdk: ^3.9.0)に設定してください。この変更により、dead_code 警告がより多く生成される可能性があります。

型システムの健全性に関する修正

getter から返された値を、getter の返り値型が dynamic または Function としてインスタンス化されたジェネリック型引数である場合に、実行時チェックなしで直接呼び出すことが可能な型システムの健全性(soundness)に関する修正 の問題を修正しました。この問題は dev-compiler DDC で発生し、他のツールには影響しません。

修正前、以下のゲッターは直接呼び出しで問題を引き起こす可能性がありました。例:

// 以下のゲッターは、直接呼び出しで問題を引き起こす可能性がありました。
// 直接呼び出し

// ゲッター
class Container<T> {
  T get value => ((int i) => i.isEven) as T;
}

// 直接呼び出し
Container<dynamic>().value(『Invocation with missing runtime checks!』);

ツールの更新

DartとFlutter MCP Server

DartとFlutter MCP Serverはブリッジとして機能し、Gemini CLI、Cursor、GitHub CopilotなどのAIコーディングアシスタントに、Dartプロジェクトのコンテキストへのアクセスを提供します。単にコードを提案するだけでなく、AIアシスタントはプロジェクトを深く理解し、代わりにアクションを実行できます。

DartとFlutter MCP Serverを使用すると、AIアシスタントに次のようなことを依頼できます:

  • 実行時エラーの修正(例を参照)。
  • 依存関係の管理(例を参照)。
  • コードの記述と修正。
  • さらに多くの機能。

DartとFlutter MCP Serverは、Dart SDKの安定版チャネルで利用可能です。

Fixing a layout issue, enabled by the Dart and Flutter MCP Server (parts of this recording have been sped up)

DartとFlutter MCP Serverによりレイアウト問題を修正(この録画の一部は速度調整されています)

より高速なDart CLI

以前は、dart analyzedart fixなどのDart CLIコマンドを実行すると、コンピュータは実行直前に分析サーバー用のコードをコンパイルする必要がありました。現在、これらのツールは分析サーバーの Ahead-Of-Time (AOT) コンパイル済みスナップショットを使用するため、サーバーは高速なネイティブマシンコードに事前コンパイルされています。

結果はお使いのソースコードによって異なりますが、サンプルパッケージで一般的なコマンドを実行し、興味深い結果を得ました。dart format のような短いコマンドは、以前の数分の1の時間で完了し、dart analyze のような長時間実行されるコマンドは、ほぼ50%高速化されました。

Example performance results after the Dart CLI update _Dart CLI更新後のパフォーマンス結果例_

pubクライアントの更新

Git依存関係は、gitタグに基づいてバージョン解決が可能になりました。

descriptorでtag_patternを使用し、version制約がある場合、パターンに一致するすべてのコミットが解決時に考慮されます。次の例では、my_dependencyのバージョン2.0.1以降のみが考慮されます:

dependencies:
  my_dependency:
    git:
      url: https://github.com/example/my_dependency
      tag_pattern: v{{version}}
    version: ^2.0.1

言語バージョン 3.9 以降、flutter制約の上限がルートパッケージで尊重されるようになりました(dart制約は既に尊重されていました)。DartまたはFlutterの制約を狭く設定することは、開発チームが共同でアプリを開発する際、全員が同じSDKバージョンを使用するように確保するのに役立ちます(詳細については、issue #95472を参照してください)。

例えば、次のようなルートpubspecの場合、pub getは、Flutter SDKのバージョンが3.33.0でない場合、失敗します:

name: my_app
environment:
sdk: ^3.9.0
  flutter: 3.33.0

Dartネイティブコンパイラ

ターゲットOSがLinuxの場合、arm(ARM32)とriscv64(RV64GC)のターゲットアーキテクチャに対するクロスコンパイルサポートを追加しました。

廃止予定機能と互換性変更

32ビット x86 アーキテクチャ

Dart は 32ビット x86 アーキテクチャを廃止しました。ほとんどの開発者には影響はありません。主に古い x86 ベースの Android エミュレーターと一部の物理デバイスに影響します。32ビット ARM と 64ビット x86_64 エミュレーターおよびデバイスは引き続きサポートされます。詳細な技術的な説明は、Dart GitHub 非推奨機能のイシューで確認できます。

dart build

dart buildはベータチャネルでプレビュー中です。

dart build -f exe <target>は現在、dart build cli — target=<target>に置き換えられました。詳細については、dart build cli — helpを参照してください。