如何让 React Native 仅在 Android 操作系统上从包中获取/导入功能
Posted
技术标签:
【中文标题】如何让 React Native 仅在 Android 操作系统上从包中获取/导入功能【英文标题】:How to get React Native to require/import function from package only on Android OS 【发布时间】:2021-11-02 13:40:42 【问题描述】:如何只为特定平台导入函数?
当使用react-native-maps 时,我只想为 android 应用用户从 react-native-maps 导入 PROVIDER_GOOGLE,这样我就不会过度使用 Google Service API(并利用 Apple Map 缺乏计量的优势)。例如如果应用在 Android 上运行,我只希望导入 PROVIDER_GOOGLE。
import MapView, Marker, PROVIDER_GOOGLE from "react-native-maps";
React-Native 文档有什么建议?
React native platform-specific-code 文档建议了导入组件的方法,但没有显示需要来自 react-native-maps 的 PROVIDER_GOOGLE
的模式。我希望为两个操作系统导入 react-native-maps 本身。
const Component = Platform.select(
ios: () => require('ComponentIOS'),
android: () => require('ComponentAndroid')
)();
<Component />
建议的另一种模式是拥有一个特定于操作系统的文件,例如
MyMap.ios.js
MyMap.android.js
所以我可以按如下方式要求组件:
import MyMap from './MyMap';
这样我只能在MyMap.android.js
风格中导入PROVIDER_GOOGLE
。
虽然此解决方案有效,但我不得不从字面上复制/粘贴所有其他内容,这似乎效率很低,因此我正在寻找一种更好的方法来仅针对特定平台要求函数本身。
【问题讨论】:
【参考方案1】:让函数存在然后require包并获取函数
let functionNeeded; if (true) functionNeeded = require( package ).functionNeeded;
这对于“需要”的经验丰富的用户来说可能是显而易见的,但基于 RN documentation 或什至类似的问题和答案 SO 1 2 对我来说不是。我找到的最好的解决方案是使用require来解压包,然后你就可以专门获取函数了。
我找到的最有效的解决方案是expo forum post。在此处重现应用于此问题的模式:
import MapView, Marker from "react-native-maps";
let PROVIDER_GOOGLE;
if (Platform.OS == 'android')
PROVIDER_GOOGLE = require('react-native-maps').PROVIDER_GOOGLE;
【讨论】:
以上是关于如何让 React Native 仅在 Android 操作系统上从包中获取/导入功能的主要内容,如果未能解决你的问题,请参考以下文章
仅在用户按下 React Native 中的按钮后如何获取位置
如何仅在 React Native 的某些屏幕中隐藏父堆栈导航器标题
如何在 React Native 中进行 Facebook 登录?
React Native:如何使用/使用 <TextInput/> 使格式卡过期?