
null安全の基本と、優しいコードの書き方
FlutterやDartに慣れてくると、ある記号たちが頻繁に目に入るようになります。
それが ?
(クエスチョンマーク)と !
(ビックリマーク)です。
はじめて見たとき、こう思った方も多いのではないでしょうか?
「ビックリマークって何?」
「nullって危ないらしいけど、何がどう危ないの?」
「とりあえず付けてるけど、本当に合ってるのかな……」
今回はそんな Flutter 初心者に向けて、「null安全」と記号の正しい使い方を、実例を交えて丁寧に解説していきます。
🌕 Dart の null safety(ヌル安全)とは?
Dart では、変数が「null(何もない)」になることを、あえて許すかどうかをはっきり書かないといけません。
これは「アプリが null のせいで落ちる」ことを未然に防ぐための設計です。
そのため、変数の宣言時に ?
を使うことで、「null を許すよ」ということを明示します。
?
クエスチョンマーク ― nullを許す型
使い方:
dartコピーする編集するString? name;
これは「name
は String
だけど、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になる可能性あり)onConditionChanged
はbool
を受け取る- だから、
newValue!
として 強制的に null じゃないとする
より安全な書き方:
dartコピーする編集するif (newValue != null) {
onConditionChanged("不安", newValue);
}
または:
dartコピーする編集するonConditionChanged("不安", newValue ?? false);
✅ nullと付き合うための基本の心得
記号 | 意味 | 例 | 注意点 |
---|---|---|---|
? | nullを許す | String? name | 使用前にnullチェックが必要 |
! | nullじゃないと信じる | userName! | 実際にnullだとアプリがクラッシュ |
?? | nullのときの代替 | userName ?? "ゲスト" | デフォルトを用意できる |
?. | nullならスキップ | userName?.length | nullチェックとアクセスを同時に行う |
🌙ひとこと
「nullかもしれない」
その一言が、どれだけのバグと事故を未然に防いできたでしょう。
あなたのコードが優しく堅牢でありますように。🌙
🧩 おまけ: late
の話
Dartには late
というキーワードもあります。
dartコピーする編集するlate String userName;
これは「今は値を入れてないけど、後で必ず入れるから null じゃない前提で使ってね」という宣言。
late
は便利ですが、初期化前に使うとクラッシュするため、設計ミスには要注意です。
📝 まとめ
Flutter/Dartにおける !
と ?
は、ただの記号ではなく、プログラムに安全性と意図を伝えるための言語です。
?
:曖昧さを受け入れる(nullを許す)!
:強い信頼を表す(nullではないと断言)??
:もしnullだったらこの値を?.
:nullなら何もしない
自分のコードが、どんな「状態」や「未確定さ」と向き合っているかを考えながら書くと、より読みやすく、壊れにくい設計になります。
👋 最後に
Flutterで開発を始めたばかりのあなたへ。!
や ?
をただの飾りにしないで、意味のある選択として使えるようになったとき、
あなたのコードはもっと強く、もっとやさしくなります。
どこかで迷ったときは、またここに帰ってきてくださいね🌙