首页 > 解决方案 > 如何让 React Native 仅在 Android OS 上从包中获取/导入功能

问题描述

如何仅导入特定平台的功能?

使用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平台特定代码文档建议了导入组件的方法,但没有显示PROVIDER_GOOGLEreact-native-maps 要求的模式。我希望为两个操作系统导入 react-native-maps 本身。

const Component = Platform.select({
  ios: () => require('ComponentIOS'),
  android: () => require('ComponentAndroid')
})();

<Component />

建议的另一种模式是拥有一个特定于操作系统的文件,例如

MyMap.ios.js
MyMap.android.js

所以我可以要求组件如下:

import MyMap from './MyMap';

这样我就只能在风味中PROVIDER_GOOGLE导入。MyMap.android.js

虽然此解决方案有效,但我不得不从字面上复制/粘贴所有其他内容,这似乎效率很低,因此正在寻找一种更好的方法来仅针对特定平台要求该功能本身。

标签: androidreact-nativegoogle-play-servicesreact-native-maps

解决方案


让函数存在然后需要包并获取函数

let functionNeeded; if (true) { functionNeeded = require( package ).functionNeeded; }

这对于“require”的经验丰富的用户来说可能是显而易见的,但对我来说不是基于RN 文档甚至类似的问题和答案 SO 1 2。我找到的最好的解决方案是使用 require 来提取包,然后您可以专门获取该功能。

我发现的最有效的解决方案是在一个世博论坛帖子中。在此处重现应用于此问题的模式:

import MapView, { Marker } from "react-native-maps";

let PROVIDER_GOOGLE;
if (Platform.OS == 'android') {
  PROVIDER_GOOGLE = require('react-native-maps').PROVIDER_GOOGLE;
}

推荐阅读