Приложения 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
вот так:
#importRCTUIManager* uiManager = [self.bridge moduleForClass:[RCTUIManager class]];
или вы можете получить его по имени:
#importRCTUIManager* uiManager = [self.bridge moduleForName:@"RCTUIManager"];
Андроид
Понимание ReactContext
Класс ReactContext
аналогичен классу RCTBridge
в iOS. Это обеспечивает удобный метод для работы с другими собственными модулями, такими как:
/** @return the instance of the specified module interface associated with this ReactContext. */ publicT 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);
Теперь вы можете вызывать методы других модулей. Надеюсь, это поможет.
- Следуйте за мной дальше Твиттер и Instagram
- Inkdrop — Уценка приложение для заметок
- Сообщество Discord сольного разработчика
Оригинал: “https://dev.to/craftzdog/inter-communication-between-native-modules-on-react-native-57bn”