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 💪