Start Debugging

Dart 3.12 の dot shorthands: Flutter コードから型名を省く

dot shorthands は Dart 3.12.2 で安定版になりました。.center や .new と書けば、コンパイラーがコンテキストから型を推論します。enum、静的メンバー、コンストラクターでの動作を解説します。

Flutter のウィジェットツリーが MainAxisAlignment.centerCrossAxisAlignment.startEdgeInsets.all の壁になっているなら、Dart はその繰り返しの多くを削除する方法をちょうど提供しました。.center と書けばコンパイラーが型を判断してくれる機能である dot shorthands が、Dart 3.12.2 で安定版になりました。Flutter 3.44 にはすでに Dart 3.12 が含まれているため、現在の stable チャネルを使っていれば今日から利用できます。

先頭のドットが実際に行うこと

dot shorthand は、むき出しの . で始まる式です。周囲のコンテキストによって対象の型が一意に定まるとき、Dart は型を完全に書かせるのではなく、その型に対してメンバーを解決します。典型的な例は、代入における enum です。

Status currentStatus = .running; // Instead of Status.running

変数は Status として宣言されているため、.runningStatus.running しか意味しえません。同じ推論は switch の内部でも働き、そこでは比較対象の値がすでに型を確定させています。

return switch (level) {
  .debug => 'gray',
  .info => 'blue',
  .warning => 'orange',
  .error => 'red',
};

enum だけではありません

この仕組みは汎用的です。コンテキストの型を通じて到達可能な静的メンバーであれば、どれでも対象になります。これには静的メソッド、静的ゲッター、名前付きコンストラクター、ファクトリーコンストラクターが含まれます。

int port = .parse('8080');      // int.parse('8080')
BigInt zero = .zero;            // BigInt.zero
Point origin = .origin();       // Point.origin() named constructor
Point p = .fromList([1.0, 2.0]); // Point.fromList(...) factory

無名コンストラクターには、この目的のために名前が与えられます。.new です。この一点こそ、新しく構築したオブジェクトを型付きフィールドに絶えず代入する実際の Flutter コードで、この機能が価値を発揮する理由です。

final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();

つまずきやすい唯一のルール

等価比較には特別なケースがあります。== または != の右辺で shorthand を使うと、Dart は左オペランドの静的な型をコンテキストとして採用します。

if (myColor == .green) {
  print('The color is green.');
}

ここでは myColorColor として型付けされているため、.greenColor.green に解決されます。shorthand は右辺に置く必要があります。.green == myColor のように逆にすると、推論の元になる左オペランドの型が存在しないため、コンパイルできません。

有効にする方法

dot shorthands は少なくとも 3.10 の言語バージョンを必要とし、この機能は Dart 3.12.2 で stable に到達しました。すでに Flutter 3.44 を使っていれば、利用できます。pubspec.yaml の SDK 制約を ^3.12.0 に引き上げれば、アナライザーは先頭のドットを警告しなくなります。runtime のコストはなく、生成されるコードにも変化はありません。これは純粋な構文であり、コンパイル時に、結局は自分で書いていたはずの完全修飾メンバーへと解決されます。

得られるのは、短いコードそのものではありません。型が値ごとに繰り返されるのではなく、宣言の一か所にだけ現れるということです。解決ルールの全体については、dot shorthands の言語ページ を参照してください。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る