💡

[Flutter]「The property '<変数名>' can't be unconditionally ...」の回避方法

に公開

Flutterコードを書いていると時々見かける「The property '<変数名>' can't be unconditionally accessed because the receiver can be 'null'」のエラーメッセージの原因と解決策をまとめます。

final parseDate = DateTime.parse(data.dateString);

例えば上記のコードを例にすると「The property 'dateString' can't be unconditionally accessed because the receiver can be 'null'」というエラーが出る。

ここで言うreceiverはdataを指しており、意味は「dataがnullの可能性がある状態でそのプロパティであるdateStringにアクセスすることはできない」となる。
(⚠️エラーメッセージの中に「dateString」が含まれているせいでわかりにくいが「dateString」がnullの可能性があるという意味ではない)

一見問題なさそうに見えるが間違っている対策

if (data == null) {
    return DateTime.now();
}

final parseDate = DateTime.parse(data.dateString);

dateのnullチェックを行ってから5行目が実行されるまでの間にdataの中身がnullに変わっている可能性があるためエラーが消えない。(ローカル変数でないのでこのコード外の他の部分でもdataを書き換えることができてしまう)

対策(非推奨):非nullアサーション演算子「!」

if (data = null) {
    return DateTime.now();
}

final parseDate = DateTime.parse(data!.dateString);

nullでないことを手動で試しているためエラーは消えるが、今後コードを書き換えてdateのnullチェックを行ってから5行目が実行されるまでの間にdataの中身がnullに変わる可能性はあるため非nullアサーション演算子の使用による解決はあまり推奨されない。

対策:ローカル変数に代入してからnullチェックを行う

final localData = date;
if (localData == null) {
    return DateTime.now();
}

final parseDate = DateTime.parse(localData.dateString);

ローカル変数であればnullチェックを行ってから5行目が実行されるまでの間にlocalDataの中身が書き換えられていないことが保証されるのでエラーが出なくなる。

Discussion