Как отправить событие из MainActivity в React Native в новой архитектуре (безмостовой режим)?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как отправить событие из MainActivity в React Native в новой архитектуре (безмостовой режим)?

Сообщение Anonymous »

У меня есть следующая реализация (я пропустил импорт и некоторые части):

Код: Выделить всё

class MainActivity : ReactActivity(), DefaultHardwareBackBtnHandler, PermissionAwareActivity {
var communicationModule: CommunicationModule? = null

fun sendMessageToNative(message: String) {
val manager = (application as MyApplication).reactNativeHost.reactInstanceManager
val reactContext = manager.currentReactContext

if (reactContext != null) {
val module = reactContext?.getNativeModule(CommunicationModule::class.java)
if (module != null) {
module.emitOnPush(message)
}
} else {
manager.addReactInstanceEventListener(object :
ReactInstanceManager.ReactInstanceEventListener {
override fun onReactContextInitialized(context: ReactContext) {
val module = context.getNativeModule(CommunicationNewModule::class.java)
if (module != null) {
module.emitOnPush(message)
}
}
})
manager.createReactContextInBackground()
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(null)
// ...
}

override fun onBackPressed() {
super.onBackPressed()
sendMessageToNative("MY_MESSAGE") // this doesn't work (no event on RN side)
}

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// assume this is not empty
val myMessage = intent?.extras["message"]
sendMessageToNative("MY_MESSAGE") // this doesn't work (no event on RN side)
}
}
и Турбо-модуль (

Код: Выделить всё

NativeCommunication.ts
)

Код: Выделить всё

import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';
import type { EventEmitter } from 'react-native/Libraries/Types/CodegenTypes';

export interface Spec extends TurboModule {
onPush: EventEmitter;
}

export default TurboModuleRegistry.getEnforcing(
'NativeCommunication',
);
и Kotlin (

Код: Выделить всё

CommunicationModule.kt
)

Код: Выделить всё

@ReactModule(name = CommunicationModule.NAME)
class CommunicationModule(private val reactContext: ReactApplicationContext) : NativeCommunicationSpec(reactContext) {

override fun getName() = NAME

companion object {
const val NAME = "NativeCommunication"
}
}
и, наконец, настройка прослушивателей на стороне React Native (например, на какой-либо странице или в MyPage.tsx)

Код: Выделить всё

const MyPage = ({ navigation }: MyPageProps): JSX.Element => {
const listenerSubscription = useRef(null);
const callbackMethod = (message: string) => { console.log(message) }

useEffect(() => {
listenerSubscription.current = NativeCommunication?.onPush(callbackMethod);
return () => {
listenerSubscription.current?.remove();
listenerSubscription.current = null;
}
}, []);
}
ПРОБЛЕМА: события, запущенные в onNewIntent и onBackPressed, не поступают в React Native.
Моя реализация работает (события поступают в React Native) только при запуске из

Код: Выделить всё

fun MainActivity.newSessionTimer(): CountDownTimer {
val sessionTimerFinishAfter = inMilliseconds(30, TimeUnit.Second)
val sessionTimerTickEvery = inMilliseconds(30, TimeUnit.Second)
return object : CountDownTimer(sessionTimerFinishAfter, sessionTimerTickEvery) {
override fun onTick(millisUntilFinished: Long) { /** no-op */ }
override fun onFinish() { sendMessageToNative("MY_MESSAGE") }
}
}
ЦЕЛЬ: иметь возможность отправлять сообщения из onNewIntent и onBackPressed и получать их на MyPage.tsx

Подробнее здесь: https://stackoverflow.com/questions/796 ... re-bridgel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»