SirMajed
SirMajed

Reputation: 173

Error showing when document is deleted from firestore with streambuilder (flutter)

Hello everybody first of all I'm sorry for my English if its not clear, I'm working on a personal project. so, I'm using StreamBuilder on firestore document with the userID of the user from 'Users' Collections. So, I have retrieved the "imageUrl" field and display it in Image Network in my application, so, I have 'Delete Account' Button, this button will delete the account from firebase auth and also delete the document that the streambuilder listens to it.

This image is the UI and the user can change the image and it will change based on the imageUrl field And this error shows when the user delete his account and the document will be deleted.

So, the error happens because the streambuilder will build ImageNetwork and retrieve the URL from the document field. Any ideas to handle the error?

this is the code for the streamBuilder that will return NetworkImage

StreamBuilder<DocumentSnapshot>(
                    stream: Firestore.instance
                        .collection('Users')
                        .document(user.getID())
                        .snapshots(),
                    builder:
                        (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                      print(snapshot.connectionState);
                      var userDocument = snapshot.data;
                      if (userDocument.data.length == 0) {
                        return const Center(
                          child: Text(
                            "Not Available",
                            style:
                                TextStyle(fontSize: 30.0, color: Colors.grey),
                          ),
                        );
                      } else
                        return AvatarGlow(
                          glowColor: Colors.redAccent,
                          endRadius: 90,
                          child: Material(
                            elevation: 8.0,
                            shape: CircleBorder(),
                            child: CircleAvatar(
                              backgroundColor: Colors.grey[100],
                              child: ClipOval(
                                child: FadeInImage(
                                  image: NetworkImage(
                                      userDocument['imageUrl'] ??
                                          'https://picsum.photos/250?image=9'),
                                  placeholder: AssetImage('assets/noImage.png'),
                                ),
                              ),
                              radius: 70,
                            ),
                          ),
                        );
                    },
                  ),

Debug error

The getter 'length' was called on null.
Receiver: null
Tried calling: length
The relevant error-causing widget was
StreamBuilder<DocumentSnapshot>

The solution was on if else blocks

StreamBuilder<DocumentSnapshot>(
                stream: Firestore.instance
                    .collection('Users')
                    .document(user.getID())
                    .snapshots(),
                builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                  if (snapshot.data != null && snapshot.data.exists) {
                    var userDocument = snapshot.data;
                     // return something
                    } 
                  }

Upvotes: 1

Views: 845

Answers (2)

Preet Shah
Preet Shah

Reputation: 1037

Ok. So, how these StreamBuilder(s) and FutureBuilder(s) are supposed be used are as follows: Note: the following code should be inside your Builder function.

if(snapshot.hasData){
  // Your normal functioning of the app will follow here.
  // Now that you know that your snapshot contains data,
  // then you access the data.
  var userDocument = snapshot.data;
  // Now, you can check if the userDocument exists or not.
}

else if(snapshot.hasError){
  // return an error message or do something else.
}
// return any default Widget while the data is being loaded.
return CircularProgressIndicator();

Also, I would recommend that once the user requests to delete his/her account, you should navigate back to the home screen...

Upvotes: 1

Frank van Puffelen
Frank van Puffelen

Reputation: 598765

For a non-existing document userDocument.data will return null, so userDocument.data.length throws the error you get.

My guess is you want to check if the document exists, which you'd do with:

if (userDocument.exists) {

Also see the reference documentation on DocumentSnapshot class, which is the type of object your userDocument is.

Upvotes: 1

Related Questions