Announcing Dart 3.7【日本語】

訳者 はじめに

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

はじめに

新年を迎え、Dart の新たな安定版リリースをお届けします。Dart 3.7 へようこそ!

今回のリリースにおけるテーマは、「開発者生産性」です。ワイルドカード変数の処理方法を調整し、Dart 言語の一貫性を向上させました。さらに、Dart フォーマッタに全く新しいスタイル、アナライザーには新たなクイックフィックスとlints、そして pub.dev には注目の新機能が複数追加されています。詳細を見ていきましょう。

Dart 3.7の発表

マクロ機能に関する更新

先日、Issue Tracker およびブログ記事 にて、実験的なマクロ機能の開発を中止することをお知らせしました。このような残念な結果に対し、コミュニティの皆様にご理解いただけたことを感謝申し上げます。

しかし、この変更によって、チームは他の価値ある開発に投資するためのリソースを確保できました。すでに build_runner のパフォーマンス改善 に着手しており、拡張言語機能 (おそらく若干形を変えるかもしれませんが) のリリースも予定しています。さらに、データモデリングのサポート、そしてシリアライゼーション/デシリアライゼーション (例えば、JSONへの/からの) をより直接的にサポートする新たな方法も模索していく予定です。

ワイルドカード変数機能

ローカル変数とパラメータの名前として _ が使用された場合、関数型言語で「ワイルドカード」と呼ばれるものとして扱われるようになります。これは、_ がプレースホルダーとして機能し、実際の変数を宣言しないことを意味します。

Dart において、コールバック関数の本体で引数が不要な場合、コールバックパラメータ名に _ を使用することが一般的です。例:

void announceCompletion(Future<void> future) { 
    future.then((_) { // <-- 
        print('Complete!'); 
    }); 
}

しかし、複数の引数が不要なコールバック関数では、引数名を _, __, ___ のように連番で付ける必要がありました。名前が衝突してしまうためです。

Dart 3.7 からは、_ という名前のパラメータやローカル変数は、実際には変数を生成しなくなりました。そのため、名前の衝突を心配する必要はありません。複数のパラメータに _ を使用できます。例:

void announceFailure(Future<void> future) { 
    future.onError((_, _) { // <-- 
        print('Error!'); 
    }); 
}

_ という名前のパラメータや変数を宣言し、使用している既存のコードは、Dart 3.7 では動作しなくなります。例えば:

var [1, 2, 3].map((_) { 
    return _.toString(); 
    // ^ Error! Reference to unknown variable.
});

このような場合、パラメータまたはローカル変数の名前を変更する必要があります。この言語仕様の変更は、パラメータとローカル変数 (トップレベル変数やメンバー変数を除く) にのみ適用されるため、ライブラリの公開 API を変更することなく、安全にリファクタリングできます。

ワイルドカード変数は、Dart 言語の一貫性を高めるための小さな機能です。 パターン において、_ で始まる変数は以前からワイルドカードとして機能していました。そして今回、パラメータとローカル変数も同様の動作をするようになりました。

Dart フォーマッタの新スタイル

Dart 3.7 には、新しい書式スタイル を採用した、再設計された Dart フォーマッタ (dart format) が搭載されています。新スタイルは、引数リストに末尾のカンマを追加した際と似ていますが、フォーマッタが自動的にカンマを付与/削除する点が異なります。例えば、

 // 古いスタイル:
void writeArgumentList(
    Token leftBracket, List<AstNode> elements, Token rightBracket) {
  writeList(
      leftBracket: leftBracket,
      elements,
      rightBracket: rightBracket,
      allowBlockArgument: true);
}

// 新スタイル:
void writeArgumentList(
  Token leftBracket,
  List<AstNode> elements,
  Token rightBracket,
) {
  writeList(
    leftBracket: leftBracket,
    elements,
    rightBracket: rightBracket,
    allowBlockArgument: true,
  );
}

これは、ツール自体、出力結果、そしてその動作にまで及ぶ大きな変更です。移行を円滑に進めるため、適用されるフォーマットスタイルは、フォーマット対象コードの言語バージョンによって決まります。言語バージョンが 3.6 以前の場合、古いスタイルが適用され、3.7 以降の場合は新しいスタイルが適用されます。

パッケージの pubspec.yaml ファイルで SDK の制約を Dart 3.7 以降に引き上げ (て、dart pub get コマンドを実行!)、パッケージをアップグレードすると、新しいフォーマットスタイルが自動的に適用されます。

dart format コマンドは、各ファイルの言語バージョンを特定するために package_config.json を参照します。そのため、パッケージ内のコードをフォーマットする前に dart pub get を実行する必要があります。CI (継続的インテグレーション) 環境でフォーマットチェックを行う場合も、同様に dart pub get の実行を忘れずに行ってください。

両方のスタイルを無期限にサポートする予定はありません。将来的に、Dart エコシステムの大半が 3.7 以降に移行した時点で、旧スタイルのサポートは廃止される予定です。

新スタイルには、長らく要望の多かった機能がいくつか搭載されています。

  • プロジェクト全体でのページ幅設定: analysis_options.yaml ファイルで、プロジェクト全体に適用するフォーマットのページ幅を設定できるようになりました。設定例:
formatter: 
    page_width: 123
  • フォーマット対象外領域の指定: コードの一部を自動フォーマットの対象から除外するには、特別なマーカーコメントをペアで使用します.
main() { 
    // dart format off 
    no + formatting + here; 
    // dart format on 
}

また、1つの重大な変更として、フォーマッタは dart format –fix をサポートしなくなりました。今後は、dart format で可能な修正に加えて、より広範な修正を適用できる dart fix コマンドを使用してください。

詳細については、CHANGELOG および FAQ をご参照ください。

Dartアナライザーのクイックフィックスと新しいリンツを更新しました

私たちは常に開発者生産性の向上を目指し、Dart 言語の改善に取り組んでおり、Dart 3.7 では、その一環としてアナライザーに新しいlints、クイックフィックス、そしてアシスト機能を追加しました。特筆すべき点として、新しいワイルドカード変数機能に対応した unnecessary_underscores lintが追加されました。

Dart 3.7 には、多岐にわたる新しいクイックフィックスとアシスト機能が搭載されており、await キーワードの欠落、不正なインポートプレフィックス、cascade_invocations のようなlintルールの違反といった、よくある問題に対する修正が含まれています。さらに、else ブロックを else if に変換する、Flutter ウィジェットを ExpandedFlexible でラップするなど、コードリファクタリングに役立つ便利なアシスト機能も追加されています。

これらの機能に関する詳細や、その他の変更点については、アナライザーの変更点 の全リストをご覧ください。

Dart Web プラットフォームの進展

1 年前に、Dart から JavaScript およびブラウザ API との連携を可能にする新しいライブラリとパッケージを導入しました。今後は、JavaScript ライブラリとして dart:js_interop を、ブラウザ API 用には package:web をそれぞれご利用ください。

Dart および Flutter エコシステムを WebAssembly 互換 API へ移行する継続的な取り組みの一環として、Dart SDK に含まれる、関連するレガシー API を非推奨とすることになりました。Dart 3.7 リリースでは、以下の 7 つの Dart SDK ライブラリが非推奨となります。

  • dart:html
  • dart:indexed_db
  • dart:js
  • dart:js_util
  • dart:web_audio
  • dart:web_gl

これらのライブラリは 2025 年末までに削除される予定です。代替ライブラリについては、JavaScript 連携 のページをご参照ください。

pub.dev パッケージサイトの新機能 (生産性向上)

昨年 12 月、pub.dev 上のパッケージのダウンロード数表示機能を追加しました。月間ダウンロード数と、週ごとのダウンロード数の推移を示すグラフが確認できます。

本日、パッケージバージョンごとのダウンロード数も確認できるようになりました。これにより、パッケージの利用者のうち、最新バージョン (または最新のメジャーバージョン) にアップグレードした割合を把握できます。このような情報は、パッケージ開発者が旧メジャーバージョンへの修正バックポートの価値を評価する上で役立つと考えられます。

  • 週間ダウンロード数グラフ

  • 週間ダウンロード数グラフ

pub.dev のダークモード

pub.dev のダークモードは以前から 多くの要望 が寄せられていましたが、本日よりダークモードへの切り替えが可能になりました。この切り替えは、pub.dev でホストされているパッケージページと API ドキュメントの両方に適用されます。

  • pub.dev のダークモード

pub.dev トピック機能

昨年、pub.dev にトピック機能のサポートを追加しました。pubspec.yaml にトピックを追加でき、統合すべき関連トピックを見つけた場合は、プルリクエストで正規化を提案できます。

pub.dev を閲覧するユーザーは、トピックをクリックして関連パッケージを検索できます。以前、pub.dev 上でトピックを検索する機能として、検索キーワード (例: “topic:widget”) を用いた検索を導入しましたが、キーワードを見つけるのが容易ではありませんでした。そこで、pub.dev の検索キーワード入力時に IDE のようなオートコンプリート機能を提供するようにしました。Ctrl + Space キーを押すか、“topic:” や “license:” のような接頭辞を入力すると、自動的に機能が有効になります。

トピック検索キーワード
トピック検索キーワードのオートコンプリート

まとめ

Dart 3.7 に関する本日のアップデートは以上です。ご意見・ご感想をお待ちしております。また、本日公開された Flutter 3.29 リリース に関するブログ記事も併せてご覧ください。それでは、また次回!