Моя проблема возникает при попытке обработать событие, исходящее из родная сторона Android. Несмотря на настройку NativeEventEmitter в index.js моего плагина и добавление прослушивателя для собственного события, обратный вызов, связанный с событием, похоже, не запускается на стороне RN.
Ниже представлена упрощенная версия реализации в index.js моего плагина:
Теперь в демонстрационном приложении в каталоге demos я способен успешно прослушивать и обрабатывать одно и то же событие:
Код: Выделить всё
const { myLibrary } = NativeModules;
const EventEmitter = new NativeEventEmitter(myLibrary);
useEffect(() => {
const validationSuccessListener = myLibConnector.onValidationResultSuccess(handleValidationSuccess);
const validationFailureListener = myLibConnector.onValidationResultFailure(handleValidationFailure);
// This works as expected when added directly in the demo app
const eventListener = EventEmitter.addListener(
'onValidationResultSuccess',
validationResult => {
console.log('>> Received onValidationResultSuccess Event');
console.log('validationResult', validationResult);
}
);
return () => {
validationSuccessListener();
validationFailureListener();
eventListener.remove();
};
}, []);
Код: Выделить всё
// Initialization of the Listener
private final MappedValidationResultListener listener = new MappedValidationResultListener() {
@Override
public void onFailure(String result, Throwable error) {
handleError(EVENT_VALIDATION_FAILURE, result, error);
}
@Override
public void onResponse(Map response) {
WritableMap writableMap = RNUtil.toWritableMap(response);
handleSuccess(EVENT_VALIDATION_SUCCESS, writableMap);
}
};
//HELPER METHODS
private void handleSuccess(String eventName, WritableMap response){
sendEvent(reactContext,eventName, response);
}
private void handleError(String eventName, String result, Throwable error) {
WritableMap resMap = Arguments.createMap();
resMap.putString("result", result);
resMap.putMap("error", error != null ? errorToMap(error) : null);
sendEvent(reactContext,eventName, resMap.toString());
}
private void sendEvent(ReactContext reactContext, String eventName, Object params) {
if (reactContext.hasActiveReactInstance()) { // Ensure the context is active
Log.d("ReactNativeJS", "Event: " + eventName + ", params: " + params.toString());
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
} else {
Log.d("ReactNativeJS", "Skipping event: " + eventName + " (CatalystInstance not active)");
}
}
Кто-нибудь сталкивался с подобной проблемой или мог бы дать представление о том, что может пойти не так в настройке плагина? ? Буду очень признателен за любую помощь!
Я видел здесь что-то подобное, но не знаю, как это исправить со своей стороны.
Я пытался отлаживать как на родной стороне, так и на стороне JS, и регистрировать выходные данные, но эмиттер на стороне плагина вообще не вызывался, даже с самыми простыми данными, которые я отправлял обратно на сторону JS. Но в демо-приложении все работает хорошо
Подробнее здесь: https://stackoverflow.com/questions/790 ... index-js-b