このサイトはアドセンスやアフィリエイト広告を利用しています

Flutter&Dart

Flutter初心者がつまずきがちな「!」と「?」の正体とは?

null安全の基本と、優しいコードの書き方

FlutterやDartに慣れてくると、ある記号たちが頻繁に目に入るようになります。
それが ?(クエスチョンマーク)と !(ビックリマーク)です。

はじめて見たとき、こう思った方も多いのではないでしょうか?

「ビックリマークって何?」
「nullって危ないらしいけど、何がどう危ないの?」
「とりあえず付けてるけど、本当に合ってるのかな……」

今回はそんな Flutter 初心者に向けて、「null安全」と記号の正しい使い方を、実例を交えて丁寧に解説していきます。


🌕 Dart の null safety(ヌル安全)とは?

Dart では、変数が「null(何もない)」になることを、あえて許すかどうかをはっきり書かないといけません。
これは「アプリが null のせいで落ちる」ことを未然に防ぐための設計です。

そのため、変数の宣言時に ? を使うことで、「null を許すよ」ということを明示します。


? クエスチョンマーク ― nullを許す型

使い方:

dartコピーする編集するString? name;

これは「nameString だけど、nullになることもある」という意味。

例:

dartコピーする編集するString? userName;

if (userName != null) {
  print("こんにちは、$userName さん");
}

よくある使い道:

  • ユーザー入力前の変数
  • ネットワーク結果の前
  • データが「まだ来ていない」状態の表現

! ビックリマーク ― nullじゃないと信じる宣言

逆に ! を使うと、**「この値は null じゃないって信じてる!」**と Dart に伝えることができます。

dartコピーする編集するString name = userName!;

この ! が意味するのは、

「この変数、nullかもしれないって型では書いてあるけど、
実際には null じゃないから大丈夫!信じて!」

という強制的な型変換です。

⚠️ 注意:

この信頼が裏切られて、もし userName が本当に null だったら……
アプリは容赦なくクラッシュします。


🤖 Flutterでの具体例:Checkboxの onChanged

Flutterでありがちな例を見てみましょう。

dartコピーする編集するCheckbox(
  value: selectedValues["不安"] ?? false,
  onChanged: (newValue) {
    onConditionChanged("不安", newValue!);
  },
);
  • newValue の型は bool?(nullになる可能性あり)
  • onConditionChangedbool を受け取る
  • だから、newValue! として 強制的に null じゃないとする

より安全な書き方:

dartコピーする編集するif (newValue != null) {
  onConditionChanged("不安", newValue);
}

または:

dartコピーする編集するonConditionChanged("不安", newValue ?? false);

✅ nullと付き合うための基本の心得

記号意味注意点
?nullを許すString? name使用前にnullチェックが必要
!nullじゃないと信じるuserName!実際にnullだとアプリがクラッシュ
??nullのときの代替userName ?? "ゲスト"デフォルトを用意できる
?.nullならスキップuserName?.lengthnullチェックとアクセスを同時に行う

🌙ひとこと

「nullかもしれない」
その一言が、どれだけのバグと事故を未然に防いできたでしょう。
あなたのコードが優しく堅牢でありますように。🌙


🧩 おまけ: late の話

Dartには late というキーワードもあります。

dartコピーする編集するlate String userName;

これは「今は値を入れてないけど、後で必ず入れるから null じゃない前提で使ってね」という宣言。

late は便利ですが、初期化前に使うとクラッシュするため、設計ミスには要注意です。


📝 まとめ

Flutter/Dartにおける !? は、ただの記号ではなく、プログラムに安全性と意図を伝えるための言語です。

  • ?:曖昧さを受け入れる(nullを許す)
  • !:強い信頼を表す(nullではないと断言)
  • ??:もしnullだったらこの値を
  • ?.:nullなら何もしない

自分のコードが、どんな「状態」や「未確定さ」と向き合っているかを考えながら書くと、より読みやすく、壊れにくい設計になります。


👋 最後に

Flutterで開発を始めたばかりのあなたへ。
!? をただの飾りにしないで、意味のある選択として使えるようになったとき、
あなたのコードはもっと強く、もっとやさしくなります。

どこかで迷ったときは、またここに帰ってきてくださいね🌙

-Flutter&Dart