Изменение языка i18next внутри async вызывает утечку памяти

Я разрешаю пользователю выбирать язык в приложении и сохраняю его локально. Когда они возвращаются в приложение, я пытаюсь использовать AsyncStorage для получения языка, но когда я вызываю

i18n.changeLanguage(currentLanguage)

это вызывает утечку памяти. вот мой код

const [language, setLanguage] = useState('') 
    const {t} = useTranslation();    
    const fetchLanguage =  async () =>{
        try{
            const currentLanguage = await AsyncStorage.getItem('language')
            if (currentLanguage === null ){
            }
            else{
                setLanguage (currentLanguage)
                i18n.changeLanguage(currentLanguage)
            }
        }catch (e){
            console.info(e)
        }
       
    }
    useEffect (()=>{
        fetchLanguage()
    }, [])
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
1
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо того, чтобы пытаться использовать i18n.changeLanguage(currentLanguage) внутри useEffect, используйте детектор языка при инициализации i18next. тогда у вас может быть язык отказа. Кредит на этот ответ принадлежит ответу Хенда Эль-Сахли здесь

const initialLanguage = 'en'

const languageDetector = {
  init: Function.prototype,
  type: 'languageDetector',
  async: true,
  detect: async callback =>{
    const storeLanguage = await AsyncStorage.getItem("language")
    const selectedLanguage = storeLanguage || initialLanguage
    callback(selectedLanguage)
  },
  cacheUserLanguage: () =>{}
}


i18n
  .use(initReactI18next) // passes i18n down to react-i18next
  .use(languageDetector)
  .init({
    resources: resources,
    compatibilityJSON: 'v3',
    fallbackLng:'en',
    interpolation: {
      escapeValue: false, // react already safes from xss
    },
});

export default i18n;

Другие вопросы по теме