react-native - AsyncStorage:不变违规:模块 AppRegistry 不是注册的可调用模块
问题描述
我正在使用 react-i18next 翻译一个 React Native 应用程序。AsyncStorage
它可以工作,但是在启动应用程序时我无法检索用户的语言环境。错误是:
ERROR TypeError: undefined is not a function, js engine: hermes ERROR Invariant Violation: Module AppRegistry 不是注册的可调用模块(调用runApplication)。错误的常见原因是应用程序入口文件路径不正确。当 JS 包损坏或加载 React Native 时出现早期初始化错误时,也会发生这种情况。,js 引擎:hermes
代码是:
import i18n, { LanguageDetectorAsyncModule } from "i18next";
import { initReactI18next } from "react-i18next";
import { Platform, NativeModules } from "react-native";
import AsyncStorage from "@react-native-async-storage/async-storage";
import en from "./en.json";
import fr from "./fr.json";
const languages = {
EN: "en",
FR: "fr",
};
const resources = {
en: { translation: en },
fr: { translation: fr },
};
const detectLocale = async () => {
const storedLocale = await AsyncStorage.getItem("locale");
if (storedLocale) {
return JSON.parse(storedLocale);
}
const mobileLocale =
Platform.OS === "ios"
? NativeModules.SettingsManager.settings.AppleLocale ||
NativeModules.SettingsManager.settings.AppleLanguages[0]
: NativeModules.I18nManager.localeIdentifier;
if (mobileLocale) {
return mobileLocale.split("_")[0];
}
return languages.EN;
};
const LanguageDetector = {
type: "languageDetector" as LanguageDetectorAsyncModule["type"],
async: false,
init: () => {},
detect: detectLocale,
cacheUserLanguage: () => {},
};
export default i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources,
fallbackLng: languages.EN,
keySeparator: ".",
whitelist: [languages.EN, languages.FR],
interpolation: { escapeValue: false },
});
所以错误来自于detectLocale
调用的函数LanguageDetector.detect()
。它是异步的,我使用await
关键字。没有 ,一切正常AsyncStorage
,因此错误必须来自这里。
我使用 React Native CLI,没有 expo,版本是迄今为止最新的版本:0.64.1。
解决方案
我遇到了类似的问题。为了使用 async 自定义语言检测器,您需要将 async 设置为 true。然后您将在detect() 上收到回调函数。
const languageDetector: LanguageDetectorAsyncModule = {
type: "languageDetector",
async: true,
// Since we set async to true, detect has now callback function...
detect: async (callback: (lang: string) => void) => {
const language = await AsyncStorage.getItem('language')
callback(lastSelectedLang);
},
init: () => {},
cacheUserLanguage: (lng: string) =>
AsyncStorage.setItem('language', lng),
};
推荐阅读
- sql-server - Powershell SQL合并输出?
- rsa - PKCS11Interop Hash with SHA256 and Sign with RSA in two steps
- ruby - 如何使用 Selenium 检测 SSL 证书信息?
- android - 片段中的 RecyclerView:没有附加适配器跳过布局
- angular - Angular 5路由器解析器未获取数据
- java - 从字符串的开头提取一些文本
- python - 添加到新窗口的文本在诅咒中不可见
- python - Groupby 和重新采样时间序列,因此日期范围是一致的
- jquery - 页面加载完成后仅调用一次函数
- ide - 将代码输入 Python 的 PyCharm IDE 时出现问题?