バッテラが如く

プログラミングしましょ!

【Flutter】null-aware演算子の使い方 (NullSafety ?演算子)

この記事の情報は次のバージョンで動作確認しています。

  • MacOS Monterey (12.1)
  • Flutter (v2.10.4)
  • VSCode (v1.67.2)
  • Flutter

    はじめに

    null-aware演算子の書き方についてまとめていこうと思います。

    C#だとnull合体演算子ともいいますね。

    A ??= B (AがNullの時だけBをAに代入する )

    String? x;
    x ??= "ABC"; // xはNullなので ”ABC"が代入される
    print(x); // ABC
     
    x ??= "DEF"; // xはNullではないので、"ABC"のまま
    
    print(x); // ABC
    

    ??=演算子は左辺がNullの時だけ右辺で初期化するってことですね!

    A ?? B (AがNUllならBを)

    String? str1; // 未初期化なのでNull
    String? str2; // 未初期化なのでNull 
    
    str1 = str2 ?? "ABC"; // str2はNullなので代わりにABCが代入される
    print(str1); // ABC
    
    str2 = "DEF"; // 初期化された
    str1 = str2 ?? "XYZ"; // str2はNullじゃないのでstr2を代入 (XYZは使用されない)
    
    print(str1); // DEF
    

    ??演算子は左辺がNullじゃなければ左辺を、Nullなら右辺を使うってことですね?

    これを??演算子を使わない書き方にするとこんな感じ。

    if (str2 != null) {
      str1 = str2;
    } else {
      str1 = "XYZ";
    }
    

    ??演算子を使うとこれを1行で書けるってことですね。

    XXX?.Func() (変数がNullじゃなければアクセス)

    TestClass? test; // 初期化していないのでNull
    test?.Func();  // Nullなので実行されない
    
    test = TestClass(); // 初期化された
    test?.Func(); // Nullじゃないので実行される
    

    これを?.演算子を使わない書き方にするとこんな感じ。

    if (test != null) {
        test.Func(); 
    }
    

    いわゆるNullチェックをしてアクセスするというやつです。
    Nullチェックをするとアンラップされるのでそのままアクセスできます。

    アンラップについてはこちらを参考にしてみてください。