Flutterデフォルトアプリのmain.dartにある「Key?」の意味

Flutter

Flutterがどんなものなのか触ってみたくて開発環境を入れてみました。
早速、flutter runしてサンプルの数字がクリックで+1されていくアプリをいじってました。

で、Dart言語って実際どうなのかな、出来そうかな、と中身を見始めて1分で躓きました笑

パッと見は三項演算子だけど

どこで詰まったかというと、main.dartを読み始めて8行目です笑笑
あ、なんか意味わからんってなってしまいました。次の箇所です。

const MyApp({Key? key}) : super(key: key);

んー、一瞬目に入った感じだと三項演算子だったのですが、よくよく見るとカッコの位置やらつじつまが合わない。
MyApp()がコンストラクタだから()内の「Key ? key」って一体……super(key: key)は分かりますよ、でも「Key ? key」ってなんやねん、ってなってしまいました。

もしかして、Dartって三項演算子の省略が出来るのか?(Key ? trueのみ的な)と思い色々ググったんですが、そんな使い方はしないみたいです。普通にKey ? true : false;の形しかないです。

むーん、と悩みに悩みググり続けること30分……やっと見つけました。
日本語ドキュメントが少なすぎて検索に引っかからなかったんです。誰も疑問に思わないのかしら。

Dart公式にドキュメントを発見

Sound null safety is available in Dart 2.12 and Flutter 2.

https://dart.dev/null-safety

Dart言語に最近追加されたNullPointerExceptionを回避する「Sound null safety」という仕組みだそうで、型の後ろに「?」を付けるとnullable(nullでもいいよ)になるとのこと。
(参考:https://dart.dev/null-safety

なので、先ほど書いた「Key ? key」は間違いで、正しくは「Key? key」なんですね。「Key?」ってことで、NullでもOKなKey型(オブジェクト)の変数、とでも言いましょうか。ちなみにVisual Studio Codeで「Key ? key」で自動コード整形するときちんと「Key? key」に整えられます。

int型であれば int? anything String型だと String? something になりますね。
たどり着くまで遠かった……

「Key?」はNullでもいいよ、Key型だよ

ということで「Key?」はNull safety(Null安全)の仕様による記述ということでした。

ちなみにNull safety(Null安全)は「Swift」「Python」「TypeScript」などの言語でも採用されているようです。Null安全なんて言葉初めて聞きました……まだまだ勉強することたくさんありますね。

Null安全についてはQiitaの記事を拝見させていただきました。興味のある方はよくまとまっているので見てみてください。

タイトルとURLをコピーしました