June 20, 2025

Dart3.8から導入されたNull-aware elementsが便利!!

Dart3.8からNull-aware elements が使えるようになり、今まで冗長だった書き方が改善されました!! 🎉
この記事では、いくつかの便利な書き方を紹介します。

ListにおけるNull-aware spread

...? を使えば、List中にnullableのWidgetを追加する場合に、nullチェックを明示的に書かずに済みます。 Flutterではこのようなコードが頻発するので、動的リストを展開する際に特に便利です!

  • Dart3.8以降
Column(
  children: [
    const Text("テキスト"),
    
    // null ならスキップされる
    ...?nullableWidgets,
  ],
);
  • Dart3.7以前
Column(
  children: [
    const Text("テキスト"),
    if (nullableWidgets != null) ...nullableWidgets,
  ],
);

Switchなどでの利用

Null-aware spreadは式にも使えます。 特にDart3からはswitch文がパターンマッチングできるようになったので、nullを返せば何も表示しないなどの書き方ができるようになります。

enum Status { loading, success, error, idle }

Column(
  children: [
    ...?switch (status) {
      "loading" => [
        const CircularProgressIndicator(),
      ],
      "success" => [
        const Text("成功しました!"),
      ],
      "error" => [
        const Text("エラーが発生しました"),
      ],
      _ => null,  // なにも表示しない
    },
  ],
);

MapにおけるNull-aware elements

Null-aware spreadと同じ感じで、MapのKey, Valueどちらにも使えます。 nullになっている不要な項目を省けるので、APIのクエリパラメータやリクエストボディを組み立てる時などに使えそうです。

String searchText = 'text';
String? limitValue; // value
String? offset; // key

final queryParams = {
  'search': searchText,
  'limit': ?limitValue,   // valueのlimitがnullなら含めない
  ?offset: '100',         // keyのoffsetがnullなら含めない
};

// => { 'search': 'text' }

まとめ

とてもシンプルですが、かなり実用的な機能が追加されました!! Dartの言語機能も日々進化していて、数年前まではDartはあまり好まれていない印象でしたが、他のモダンな言語に近い書き心地になってきました。
個人的には、あとはImmutable Object(Kotlinのdata classのような機能)が言語レベルで対応してくれれば、普段使いするには問題ないレベルになるのではないかなと思います。
がんばれDart 💪

© AAkira 2023