安卓 & iOS 原生模块(Calendar 原生模块)
Calendar 原生模块的使用和深入研究
您想在 React Native 应用程序内的 JavaScript 中访问 iOS/Android 原生日历 API,以创建日历事件。React Native 没有公开与原生日历库通信的 JavaScript API。然而,通过原生模块,您可以编写与原生日历 API 通信的原生代码。然后您可以在 React Native 应用程序中的 JavaScript 里 调用该原生代码。
有多种方法可以为您的 React Native 应用程序编写原生模块:
- 创建一个可在您的 React Native 应用程序中导入的原生库。阅读[创建原生库](local-library-setup)指南以了解更多信息。
- 直接在您的 React Native 应用程序的 iOS / Android 项目中
- 作为一个 NPM 包,可以被您/其他 React Native 应用程序作为依赖项安装。
本指南将首先介绍如何直接在 React Native 应用程序内实现原生模块。
安卓原生模块
创建一个名为 CalendarModule 的原生模块,它允许你从 JavaScript 访问 Android 的日历 API。
创建自定义原生模块文件
创建工程npx react-native@latest init AwesomeProject
,
在 Android Studio 中打开 React Native 应用程序中的 Android 项目。
第一步是在 android/app/src/main/java/com/your-app-name/
文件夹中创建 Java/Kotlin
文件(CalendarModule.java 或 CalendarModule.kt)
。该 Java/Kotlin
文件将包含您的原生模块 Java/Kotlin
类。
然后添加如下代码:
- Java
- Kotlin
package com.your-apps-package-name; // replace your-apps-package-name with your app’s package name
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import java.util.Map;
import java.util.HashMap;
public class CalendarModule extends ReactContextBaseJavaModule {
CalendarModule(ReactApplicationContext context) {
super(context);
}
}
package com.awesomeproject
import android.util.Log
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
class CalendarModule2(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
override fun getName() = "CalendarModule2"
@ReactMethod
fun createCalendarEvent(name: String, location: String) {
Log.d("CalendarModule2", "Create event called with name: $name and location: $location")
}
}
从技术上讲,Java/Kotlin
类只需要扩展BaseJavaModule
类或实现NativeModule
接口,才能被 React Native
视为原生模块。
所以示例中CalendarModule
类继承自ReactContextBaseJavaModule
类。 ReactContextBaseJavaModule
提供了ReactApplicationContext
(RAC)的访问权限,这对于需要挂钩到活动生命周期方法的原生模块非常有用。
模块名称
所有 Android
平台上的 Java/Kotlin
原生模块都需要实现 getName()
方法。该方法返回一个字符串,代表了原生模块的名称。这样,原生模块就可以通过其名称在 JavaScript
中被访问。例如,在下面的代码片段中,getName()
返回 "CalendarModule"。
- Java
- Kotlin
// add to CalendarModule.java
@Override
public String getName() {
return "CalendarModule";
}
override fun getName() = "CalendarModule2"
可以通过以下方式在 JS 中访问原生模块:
const {CalendarModule} = ReactNative.NativeModules;