⚠️
_TypeError (Null check operator used on a null value)
!のエラー問題を解決したい!
Firebaseで開発をしているとよく!をつけるのですが、基本これは使わないでと言われます。なんでかっていうと、Firestoreから取得したデータがnullだったらクラッシュしちゃうからです。毎回このエラーに当たると心がすり減ります🫠
例えばこんなコードがあるのですが、これだとクラッシュするエラーが発生することがあります。これはFutureProviderでDocumentSnapshotでデータを取得するときに使ってますね。
// Firestoreからデータを取得する関数
Future<void> fetchData() async {
final data = ref.read(myPageProvider);
nameController.text = data.asData?.value.data()!.name ?? '';
profileController.text = data.asData?.value.data()!.profile ?? '';
imageUrl.value = data.asData?.value.data()!.imageUrl ?? '';
}
これがプロバイダーのコード:
Future<DocumentSnapshot<UserState>> myPage(MyPageRef ref) async {
try {
final uid = ref.read(currentUserUidProvider);
final serRef = await ref.read(converterProvider).doc(uid).get();
return serRef;
} on Exception catch (e) {
throw Exception(e);
} finally {
logger.d('FutureProviderの処理を実行');
}
}
で解決策ですけど、これにすると治りました🙌
さっきのコードカッコ悪いですね💦
if文で分岐処理を追加してnull checkをすれば事故を防止できる。
// Firestoreからデータを取得する関数
Future<void> fetchData() async {
final data = ref.read(myPageProvider);
final dataValue = data.asData?.value.data();
if (dataValue != null) {
nameController.text = dataValue.name;
profileController.text = dataValue.profile;
imageUrl.value = dataValue.imageUrl;
}
}
まとめ
昔、よく画面が赤くなるエラーが出てたことあるのですが、!が原因でしたね。つけてはダメってわけではなくて、データが必ず取得できる保証があるなら、Swiftでも!つけるのあるんですけど、これはnullではないことを強要するものです。Swiftだったらnilですけどね。
Discussion