Рубрики
Без рубрики

Между- связь между собственными модулями на React Native

Приложения React Native могут быть расширены с помощью собственных модулей. Хотя они просты в использовании с помощью JavaScript, сделайте это в… С тегами react native, swift, kotlin, java.

Приложения React Native могут быть расширены с помощью собственных модулей. Хотя они просты в использовании с помощью JavaScript, выполнение этого между собственными модулями официально не задокументировано. У меня есть несколько собственных собственных модулей, и я хотел вызвать эти методы из другого собственного модуля в ObjC/Swift/Java/Kotlin, чтобы избежать написания повторяющегося кода. Я углубился в суть React Native, чтобы понять, как это сделать.

iOS

Понимание RCTBridge

RCTBridge – это класс для взаимодействия с приложением JavaScript. Он предоставляет несколько полезных методов для работы с другими собственными модулями:

/**
 * Retrieve a bridge module instance by name or class. Note that modules are
 * lazily instantiated, so calling these methods for the first time with a given
 * module name/class may cause the class to be synchronously instantiated,
 * potentially blocking both the calling thread and main thread for a short time.
 *
 * Note: This method does NOT lazily load the particular module if it's not yet loaded.
 */
- (id)moduleForName:(NSString *)moduleName;
- (id)moduleForName:(NSString *)moduleName lazilyLoadIfNecessary:(BOOL)lazilyLoad;
// Note: This method lazily load the module as necessary.
- (id)moduleForClass:(Class)moduleClass;

Вы можете получить экземпляр модуля с помощью этих методов.

Получить экземпляр RCTBridge

В вашем модуле bridge вы должны добавить свойство для RCTBridge вот так:

@interface YourModule : NSObject 

@property (nonatomic, weak) RCTBridge *bridge;

@end

@implementation YourModule

@synthesize bridge = _bridge;

@end

Это оно. Свойство bridge устанавливается автоматически при инициализации вашего модуля.

Получить другой экземпляр собственного модуля

Например, вы можете получить экземпляр RCTUIManager вот так:

#import 

RCTUIManager* uiManager = [self.bridge moduleForClass:[RCTUIManager class]];

или вы можете получить его по имени:

#import 

RCTUIManager* uiManager = [self.bridge moduleForName:@"RCTUIManager"];

Андроид

Понимание ReactContext

Класс ReactContext аналогичен классу RCTBridge в iOS. Это обеспечивает удобный метод для работы с другими собственными модулями, такими как:

  /** @return the instance of the specified module interface associated with this ReactContext. */
  public  T getNativeModule(Class nativeModuleInterface)

Это позволяет вам получить экземпляр собственного модуля по классу.

Получить экземпляр ReactContext

В вашем модуле bridge ваш код уже должен выглядеть следующим образом:

public class YourModule extends ReactContextBaseJavaModule {
    private final ReactApplicationContext reactContext;

    public AttachmentProcessorModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

Таким образом, вы можете быстро получить доступ через this.reactContext .

Получить другой экземпляр собственного модуля

Например, вы можете получить экземпляр UIManagerModule вот так:

import com.facebook.react.uimanager.UIManagerModule;

UIManagerModule uiManagerModule = this.reactContext.getNativeModule(UIManagerModule.class);

Теперь вы можете вызывать методы других модулей. Надеюсь, это поможет.

Оригинал: “https://dev.to/craftzdog/inter-communication-between-native-modules-on-react-native-57bn”