Чтобы передать массив из React Native в нативный модуль Java и обработать его там, вам потребуется создать мост между JavaScript и Java с помощью React Native Bridge.
1. Сначала вам нужно создать модуль Java, который будет обрабатывать переданный массив. Создайте новый класс в папке android/app/src/main/java/your/package/name с именем CustomModule.java:
package your.package.name; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; public class CustomModule extends ReactContextBaseJavaModule { public CustomModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "CustomModule"; } @ReactMethod public void processArray(ReadableArray array) { // Ваш код для обработки массива здесь // Пример кода ниже создает новый массив и отправляет его обратно в JavaScript WritableArray newArray = Arguments.createArray(); for (int i = 0; i < array.size(); i++) { WritableMap map = array.getMap(i); // Ваша обработка здесь newArray.pushMap(map); } // Отправляем обратно в JavaScript getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("processedArray", newArray); } }
2. Далее вам нужно зарегистрировать ваш модуль Java в MainApplication.java. Он находится в android/app/src/main/java/your/package/name:
package your.package.name; import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader; import java.util.Arrays; import java.util.List; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), // Добавьте ваш пакет сюда new CustomPackage() ); } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); } }
3. Далее вам нужно создать пакет для вашего модуля Java, чтобы его можно было зарегистрировать в MainApplication.java. Создайте класс CustomPackage.java в той же папке Java, что и CustomModule.java:
package your.package.name; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CustomPackage implements ReactPackage { @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); // Добавляем ваш модуль в пакет modules.add(new CustomModule(reactContext)); return modules; } }
4. Теперь вы можете использовать ваш модуль Java в коде React Native. В JavaScript необходимо импортировать NativeModules
и вызвать метод processArray
:
import { NativeModules } from 'react-native'; const CustomModule = NativeModules.CustomModule; const arrayToProcess = [ { name: 'John', age: 25 }, { name: 'Jane', age: 30 }, ]; CustomModule.processArray(arrayToProcess);
5. Можно даже подписаться на событие processedArray
в JavaScript, чтобы получить обработанный массив из Java:
import { NativeEventEmitter, NativeModules } from 'react-native'; const CustomModule = NativeModules.CustomModule; const eventEmitter = new NativeEventEmitter(CustomModule); const subscription = eventEmitter.addListener( 'processedArray', (processedArray) => console.log(processedArray) ); // Отменить подписку, когда она больше не нужна subscription.remove();
Теперь, когда вы вызываете processArray()
в JavaScript, массив будет передан в модуль Java, обработанный и отправлен обратно в JavaScript через событие 'processedArray'.