⚠️

_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