如何让 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/> 使格式卡过期?

仅在 iOS 上没有弹出询问权限,未确定权限,react-native-community/geolocation

React-native 占位符仅在 Android 上部分可见