Implementing Native Modules & Native Components in React Native

React Native allows developers to write cross-platform mobile applications using JavaScript and React. However, sometimes you need to interact with native functionality that isn’t available in React Native’s built-in APIs. This is where Native Modules and Native Components come into play.

In this blog, we’ll explore:

  • What are Native Modules and Native Components?
  • How to implement Native Modules in Android & iOS
  • How to create Native UI Components in Android & iOS
  • Best practices and use cases

What are Native Modules and Native Components?

Native Modules

Native Modules allow you to invoke native platform APIs (Java/Kotlin for Android, Objective-C/Swift for iOS) from JavaScript. This is useful for features like accessing device sensors, file systems, Bluetooth, and more.

Native Components

Native Components allow you to create UI elements using native views. This is helpful when React Native’s built-in UI components don’t meet performance or design requirements.

Creating a Native Module in Android

1. Modify Android Manifest for Permissions

Add necessary permissions in android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

2. Create a Native Module in Java/Kotlin

Create a Java file:android/app/src/main/java/com/yourapp/CustomModule.java

package com.yourapp;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;

public class CustomModule extends ReactContextBaseJavaModule {
public CustomModule(ReactApplicationContext reactContext) {
super(reactContext);
}

@Override
public String getName() {
return "CustomModule";
}

@ReactMethod
public void showMessage(String message, Promise promise) {
System.out.println("Message from JS: " + message);
promise.resolve("Message received: " + message);
}
}

3. Register the Module in React Native

Modify MainApplication.java:

import com.yourapp.CustomModule;

@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new CustomPackage() // Register module here
);
}

4. Use the Native Module in JavaScript

import { NativeModules } from 'react-native';

const { CustomModule } = NativeModules;

const callNativeFunction = async () => {
try {
const result = await CustomModule.showMessage("Hello from React Native!");
console.log(result);
} catch (error) {
console.error(error);
}
};

Creating a Native Module in iOS (Objective-C)

1. Create a Native Module in Objective-C

Create a file: ios/CustomModule.m

#import "React/RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(CustomModule, NSObject)

RCT_EXTERN_METHOD(showMessage:(NSString *)message resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

@end

2. Implement the Native Module in Swift

Create a file: ios/CustomModule.swift

import Foundation

@objc(CustomModule)
class CustomModule: NSObject {
@objc func showMessage(_ message: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
print("Message from JS: \(message)")
resolve("Message received: \(message)")
}
}

3. Use the Native Module in JavaScript

import { NativeModules } from 'react-native';

const { CustomModule } = NativeModules;

CustomModule.showMessage("Hello from React Native!")
.then(response => console.log(response))
.catch(error => console.error(error));

Creating a Native UI Component in Android

1. Create a Custom View in Java

Create CustomViewManager.java:

package com.yourapp;

import android.view.View;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;

public class CustomViewManager extends SimpleViewManager<View> {
@Override
public String getName() {
return "CustomView";
}

@Override
public View createViewInstance(ThemedReactContext reactContext) {
View view = new View(reactContext);
view.setBackgroundColor(0xFFFF0000); // Red background
return view;
}
}

2. Register the View Manager

Modify MainApplication.java:

@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new CustomViewPackage() // Register custom view
);
}

3. Use the Custom UI Component in JavaScript

import { requireNativeComponent } from 'react-native';

const CustomView = requireNativeComponent('CustomView');

export default function App() {
return <CustomView style={{ width: 100, height: 100 }} />;
}

Creating a Native UI Component in iOS (Swift)

1. Create a Custom View in Swift

Create CustomView.swift:

import UIKit
import React

@objc(CustomViewManager)
class CustomViewManager: RCTViewManager {
override func view() -> UIView! {
let view = UIView()
view.backgroundColor = UIColor.red
return view
}

override static func requiresMainQueueSetup() -> Bool {
return true
}
}

2. Register the View Manager

Create CustomViewManager.m:

#import "React/RCTViewManager.h"

@interface RCT_EXTERN_MODULE(CustomViewManager, RCTViewManager)
@end

3. Use the Custom UI Component in JavaScript

import { requireNativeComponent } from 'react-native';

const CustomView = requireNativeComponent('CustomView');

export default function App() {
return <CustomView style={{ width: 100, height: 100 }} />;
}

Conclusion

  • Native Modules allow React Native to call native code for advanced features.
  • Native UI Components enable high-performance and custom UI elements.
  • Always follow best practices when bridging native functionality to React Native.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.