Anirudh Agrawal
Anirudh Agrawal

Reputation: 113

Getting a field value from known document in firebase flutter

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

Upvotes: 3

Views: 1666

Answers (3)

Anirudh Agrawal
Anirudh Agrawal

Reputation: 113

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.

Upvotes: 2

Hemal Moradiya
Hemal Moradiya

Reputation: 2077

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');
            },
          ),

Upvotes: 0

Peter Haddad
Peter Haddad

Reputation: 80952

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

Upvotes: 0

Related Questions