Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I unsubscribe from a Firestore listener in React-Native?

How do I unsubscribe from a Firestore listener in React-Native? I have a function where I am fetching and listening to changes in Firestore:

_fetchPatientsList() {
        var query = firestore().collection('Collection').doc().collection('public');
        query = query.where('act', '==', 1);
        query = query.where('city', '==', this.state.selected_city);
        query = query.orderBy('update_time', 'desc');
        query = query.limit(10);

        query.onSnapshot({
            error: (e) => this.setState({ errorMessage: e, refreshingPatients: false }),
            next: (querySnapshot) => {
                ///do something      
            },
        });
 }

And I would like to unsubscribe when I log out:

    _logOutHandler = () => {
    auth()
        .signOut()
        .then(() => {
            console.log('User signed out!')
        });
    let unsub = firestore().collection('Collection').doc().collection('public').onSnapshot(() => {
    });

    // Stop listening for changes
    unsub();
}

Is this the proper way of doing it?


1 Answers

you have to save a listener reference const unsubRef = query.onSnapshot

use the reference, example:

const unsubRef = query.onSnapshot({
 error: (e) => this.setState({ errorMessage: e, refreshingPatients: false }),
 next: (querySnapshot) => {
   ///do something      
 },
});

//just make it to unsubscribe
unsubRef();

to stop listener on other function, you can make this:


import from ....

//variables
let unsubRef;


// function to stop listener
stopListener = (unsubRef) => {
   unsubRef();
};

//save the reference for this query
unsubRef = query.onSnapshot({
            error: (e) => this.setState({ errorMessage: e, refreshingPatients: false }),
            next: (querySnapshot) => {
                ///do something      
            },
        });


//other function you want cancel listener
otherFunc = async() => {
   // some code

   //stop the listener
   await this.stopListener(unsubRef);
   //signout code
};

you can see more details here: https://rnfirebase.io/firestore/usage#realtime-changes or https://firebase.google.com/docs/firestore/query-data/listen#detach_a_listener

like image 134
Remato Avatar answered Nov 20 '25 19:11

Remato



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!