【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part41 その他の重要な機能

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part41 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part40 Dartの特徴

今まで紹介されたもの以外で重要な機能について学習します。

その他の重要な機能

Conditional member access operator

Dartでは変数にnullが格納されている場合にメソッドを呼び出すとエラーになります。
JavaではおなじみのNullPointerExceptionというものでしょうかね。あまり遭遇したくないものです😅
?.を使用することでエラーにすることなくnullで返却するというありがたい演算子です。

safe navigation operatorとも呼ばれるようです。

最新のDartではnull-safeな言語となったようです。

Dartの型の理解しておきたいあれこれ(Null safety編) – Qiita

その関係で本書の一部の実装は警告またはエラーとなることがあるようです。
私も本書で学習していて何度か遭遇しました。

この?.を使えばいったん問題は解消されるのかと思ったのですがそうでもないようです。

DartPad (dartlang.org)で確認してみましたが思わぬところでエラーとなります。

main(){
  // 以下の行でエラーです。
  // Stringの変数にnullを格納してはいけない!というエラーです。
  String target = null;
  
  // ?. の部分で警告が出ます。
  var length = target?.trim()?.toLowerCase()?.length ?? 0;
}

これなら問題ありません。(当然ですよね)

main(){
  // これなら問題ありません。
  String target = '';
  
  // null-safetyなので ?.は絶滅したのでしょうか?
  // ちなみに「0」の部分で警告となります。??が 「if null」の意味を持つので
  // 0の処理に到達することが無いからです。
  var length = target.trim().toLowerCase().length ?? 0;
  
  print(length);
}

自作クラスでもnullを代入できません。

class Hoge {
  
}
main(){
  // 自作のクラスでもnullはダメです。
  Hoge target = null;
}

変数宣言時に型に?を使うとnullを代入できるようになります。

main(){
  // 型に「?」を付与
  // これでもinfoレベルのメッセージが出ます。
  String? target = null;
  
  // ?. の部分で警告が出ます。
  var length = target?.trim()?.toLowerCase()?.length ?? 0;
  
  print(length);
}

最後に

現代のDartでは「とにかくnullを使うな!」と言わんばかりの厳しいチェックが行われています。
?.演算子は今後あまり見かけなくなるのかもしれません。

今日はここまで!