在 Android React Native 应用程序中正确使用 Intl
Using Intl properly in Android React Native app
我正在尝试使用 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)
如果您使用的是自定义 JSC,请不要忘记将国际版本导入为 explained in the read me of JSC Android Buildscripts:
For React Native version 0.59, replace original artifact id with
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
}
我想删除这个问题,但我不能,因为已经有另一个答案了。
与JSC无关。我认为我的构建脚本没有正确更新 APK,我一遍又一遍地尝试使用旧的伪造 APK。否则,显然我做的一切都很好,因为它现在可以使用新的 APK。
小更新,从 React Native v0.60+ 开始,您可以定义 intl+ 版本的库。
在你的app/build.gradle
中:
def jscFlavor = 'org.webkit:android-jsc-intl:+'
并在您的依赖项中实现它:
dependencies {
...
if (enableHermes) {
...
} else {
implementation jscFlavor
}
}
如果在您的 app/build.gradle 中禁用 Hermes 不是一个选项,并且您不能使用 org.webkit:android-jsc-intl:+
那么 Intl polyfill 可以解决问题:
npm install intl
代码中:
import 'intl';
import 'intl/locale-data/jsonp/en'; // or any other locale you need
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
)}
我正在尝试使用 Intl
的数字格式化程序,它在 iOS 上完美运行,并且当调试器附加到 iOS 或 Android 时,但仅由于 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)
如果您使用的是自定义 JSC,请不要忘记将国际版本导入为 explained in the read me of JSC Android Buildscripts:
For React Native version 0.59, replace original artifact id with 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 }
我想删除这个问题,但我不能,因为已经有另一个答案了。
与JSC无关。我认为我的构建脚本没有正确更新 APK,我一遍又一遍地尝试使用旧的伪造 APK。否则,显然我做的一切都很好,因为它现在可以使用新的 APK。
小更新,从 React Native v0.60+ 开始,您可以定义 intl+ 版本的库。
在你的app/build.gradle
中:
def jscFlavor = 'org.webkit:android-jsc-intl:+'
并在您的依赖项中实现它:
dependencies {
...
if (enableHermes) {
...
} else {
implementation jscFlavor
}
}
如果在您的 app/build.gradle 中禁用 Hermes 不是一个选项,并且您不能使用 org.webkit:android-jsc-intl:+
那么 Intl polyfill 可以解决问题:
npm install intl
代码中:
import 'intl';
import 'intl/locale-data/jsonp/en'; // or any other locale you need
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
)}