Getting a field value from known document in firebase flutter

Viewed 924

I want a user to give a value in my app and other user to see it. But i can upload data to firebase but not get it on the other side. I have null safety enabled on flutter. The code is :-

child: StreamBuilder(
stream:FirebaseFirestore.instance.collection('Collection name').doc('doc id').snapshots()
                  builder: (context, snapshot){
                    if(snapshot.hasData){
                      return Text(snapshot.data['Field name'].toString());  // here my editor shows error saying 'The method '[]' can't be unconditionally invoked because the receiver can be 'null'.' and asks for a null check and then shows error again
                    }
                    return Text('Nothing');
                  }
                ),

Edit: I am getting only 'type '_JsonDocumentSnapshot' is not a subtype of type 'Map<String, dynamic>' in type cast' as the error

And if I change

if(snapshot.hasData){
                      return Text(snapshot.data['Field name'].toString()); 

to

if (snapshot.hasData) {
                        return Text(snapshot.data.toString());
                      }

i get output as 'Instance of '_JsonDocumentSnapshot'' where the data should be. I am using null check dart

3 Answers

Thannks for everyone's support, but i have accidently found and answer. I read that the data type of that is DocumentSnapshot and this worked for me

builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    var numGuess = snapshot.data as DocumentSnapshot;
                    return Text(numGuess['Field name'].toString());
                  }
                  return Text('Nothing');
                }
This works for null safety.

Since you are retrieving a collection then try the following:

return Text(snapshot.data!.docs[0].data()["Field Name"]);

A collection will return a list of documents, therefore use the docs property to be able to access the document. The above code will show the field in the first document in the list, it's better if you use a listview to return all documents.

Check:

https://api.flutter.dev/flutter/widgets/ListView-class.html

Give datatype to your StreamBuilder like this

StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
            stream:
                FirebaseFirestore.instance.collection('Collection name').doc('doc id').snapshots(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Text(snapshot.data?.data()?['Field name']);
              }
              return Text('Nothing');
            },
          ),
Related