Home > Software design >  Flutter Firestore returns error without any problem in the code
Flutter Firestore returns error without any problem in the code

Time:03-16

The following code returns error "NoSuchMethodError"

StreamBuilder(
                                stream: SalaryService.getSingle(),
                                builder: (_, snapshot) {
                                  if (snapshot.data() != null) {
                                    print('step 3');
                                    return Text(
                                      snapshot.data['value'].toString(),
                                    );
                                  } else
                                  {
                                    return Text(
                                      "Nil",
                                      
                                    );
                                  }
                                },
                              ),
class SalaryService {
  static Stream<DocumentSnapshot> getSingle() {
    Stream<DocumentSnapshot> snapshot = FirebaseFirestore.instance
        .doc(userId   '/salary'   todayYM)
        .snapshots();

    snapshot.forEach(
      (element) {
        // prints all the documents available
        // in the collection
        print(element.data().toString());
        // print((element.data() != null).toString());
      },
    );
    return snapshot;
  }
}

The cloudstore document does not exist to begin with until the user updates his salary hence the if else used.

P.S.: I am a rookie

CodePudding user response:

Two things:

  1. It is best practice to check whether the QueryDocumentSnapshot returned has data, plus check whether the document reference exists first by casting it as a DocumentSnapshot as opposed to pull the data straight up, as in:
if (snapshot.hasData && (snapshot.data as DocumentSnapshot).exists) { // ... }
  1. you cannot pull the properties out of the snapshot like snapshot.data['field'] without pulling the data out first as a Map<String, dynamic>; you at least have to do first is snapshot.data() (after checking that it exists), then pull the fields out of the returned map, as in:
Map<String, dynamic> docData = (snapshot.data as DocumentSnapshot).data() as Map<String, dynamic>;
print(docData['value']);

Check this Gist for the full code (replace with your Firebase config settings at the top if you want to test it by running it on DartPad.dev.

  • Related