💡
[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