Эффект использования приводит к утечке памяти, как избежать этого в функциях firebase

#react-native #memory-leaks #use-effect #react-native-firebase #react-functional-component

#реагировать-родной #утечки памяти #использование-эффект #react-native-firebase #реагирующий-функциональный-компонент

Вопрос:

 useEffect(() => {
        auth().onAuthStateChanged(user => {
            if (user) {
                const useruid = auth().currentUser.uid
                const subscriber = firestore()
                    .collection('dailyusage')
                    .doc(useruid)
                    .collection('dailyusage')
                    .onSnapshot(documentSnapshot => {
                        getReminderlist(numberofitemstoload, false)
                    });
                return () => subscriber();
            }
        })
    }, []);
 

Привет, я использую эту функцию, и это указывает на утечку памяти, поэтому я не могу понять, как использовать эту функцию, чтобы она не приводила к утечке памяти. Итак, дайте мне знать, как я могу предотвратить утечку памяти в этом.

Ошибка, которую я получаю

Невозможно выполнить обновление состояния реакции для размонтированного компонента. Это ошибка, но она указывает на утечку памяти в вашем приложении. Чтобы исправить это, отмените все подписки и асинхронные задачи в функции очистки useEffect.

Комментарии:

1. Ошибка может быть в методах getReminderlist, поскольку вы можете сохранить состояние в этом методе.

2. @Jigneshmayani что вы предпочитаете для ее решения.

3. Можете ли вы показать код метода getReminderlist, чтобы я мог глубоко погрузиться в это и попытаться вам помочь?

Ответ №1:

При использовании useEffect вы можете вернуть функцию, которая будет запущена при очистке. Итак, в вашем случае вам понадобится что-то вроде этого:

 useEffect(() => {
    const unsubscribe =    auth().onAuthStateChanged(user => {
           if (user) {
               const useruid = auth().currentUser.uid
               const subscriber = firestore()
                   .collection('dailyusage')
                   .doc(useruid)
                   .collection('dailyusage')
                   .onSnapshot(documentSnapshot => {
                       getReminderlist(numberofitemstoload, false)
                   });
               return () => subscriber();
           }
       })
   //below is cleanup function
       return () => unsubscribe();

   }, []);
 

Это может вам помочь.