在 Android React Native 应用程序中正确使用 Intl
Posted
技术标签:
【中文标题】在 Android React Native 应用程序中正确使用 Intl【英文标题】:Using Intl properly in Android React Native app 【发布时间】:2019-11-18 11:50:54 【问题描述】:我正在尝试使用 Intl
的数字格式化程序,它在 ios 上以及当调试器附加到 iOS 或 android 时完美运行,但由于 Android 中的 JSC 过时,仅在没有附加调试器的情况下在 Android 上失败。
经过一番研究,我发现了两种可能的解决方案:
使用Intl
polyfill
在 Android 中使用自定义 JSC
在使用 yarn 安装 intl
和 react-intl
之后,我首先尝试了 Intl
polyfill:
//in my app's index.js
if (!global.Intl)
global.Intl = require('intl');
虽然它仍然写着ReferenceError: Can't find variable: Intl
。
然后我放弃并尝试包含自定义 JSC(我已确认正确引用了自定义 AAR),但我仍然遇到相同的错误。无论我做什么,我都无法让Intl
在没有附加调试器的情况下在 Android 上运行。
我做错了什么? (我正在使用 React Native 0.59.9)
【问题讨论】:
【参考方案1】:小更新,从 React Native v0.60+ 起,您可以定义 lib 的 intl+ 版本。
在你的app/build.gradle
:
def jscFlavor = 'org.webkit:android-jsc-intl:+'
并在您的依赖项中实现它:
dependencies
...
if (enableHermes)
...
else
implementation jscFlavor
【讨论】:
谢谢!这是一个救命稻草,也是最简单的解决方案。 我在其他地方看到了这个解决方案,但他们没有提到这个依赖步骤。为什么? @HenriqueBruno 对我来说,依赖步骤已经存在。jscFlavor
已经存在,这只是改变值
@Simon 在此之后我遇到了语义错误。
警告这会使您的应用程序大小增加大约 25 MB,这是我的情况,需要找出其他方法。【参考方案2】:
如果禁用 Hermes 不是您的 app/build.gradle 中的选项,并且您不能使用 org.webkit:android-jsc-intl:+
,那么 Intl polyfill 可以解决此问题:
npm install intl
在代码中:
import 'intl';
import 'intl/locale-data/jsonp/en'; // or any other locale you need
【讨论】:
这只能在android上做吗?例如if (Platform.android) require('intl').default 【参考方案3】:如果您使用的是自定义 JSC,请不要忘记将国际版本导入为 explained in the read me of JSC Android Buildscripts:
对于 React Native 0.59 版,将原始工件 id 替换为 android-jsc-intl
dependencies + // Make sure to put android-jsc at the the first + implementation "org.webkit:android-jsc-intl:r241213" + compile fileTree(dir: "libs", include: ["*.jar"]) implementation "com.android.support:appcompat-v7:$rootProject.ext.supportLibVersion" implementation "com.facebook.react:react-native:+" // From node_modules
【讨论】:
【参考方案4】:npm i intl
导入之后
import "intl";
import "intl/locale-data/jsonp/en";
然后使用Intl
例如:-
new Intl.NumberFormat("en-IN",
style: "currency",
currency: "INR",
).format(
(travelTimeInformation?.duration.value *
SURGE_CHARGE_RATE *
multiplier) /
100
)
【讨论】:
【参考方案5】:我想删除这个问题,但我不能,因为已经有另一个答案了。
它与 JSC 无关。我的构建脚本没有正确更新 APK,而我认为它是,我一遍又一遍地尝试旧的伪造 APK。否则,显然我做的一切都正常,因为它现在可以使用新的 APK。
【讨论】:
以上是关于在 Android React Native 应用程序中正确使用 Intl的主要内容,如果未能解决你的问题,请参考以下文章
使用 lottie-react-native (2.6.1) 时,React native expo 应用程序在 android 上崩溃,但适用于 ios
React Native - 如何在 React Native 应用程序中使用 WebView 显示我的网站通知(适用于 Android)
部署由React-Native开发的android和IOS应用程序