Comment un module natif peut-il rappeler une méthode de pont interne JavaScript, puis effectuer un traitement dans la méthode interne, par exemple analyser des données dans JSON, puis déclencher un événement que l'application native réagit?Comment écrire réagissent natif "module natif" (pont) qui réutilise le code JavaScript commun?
Pour les modules de pont multiplateformes, je souhaite éviter la duplication de code dans à la fois Objective C et Java. Lorsque cela est possible, je veux écrire du code de module de pont multiplateforme en JavaScript et réutiliser pour Android et iOS.
Ma solution actuelle:
Cela fonctionne.
Cela se traduira par deux appels à sendEventWithName:
- sendEventWithName avec le "_processResponseInJavaScriptMethod"
- forwardEventWithName à sendEventWithName à réagir application native.
Question:
Y at-il une approche pour le code natif pour traiter les données en utilisant un appel synchrone JS, puis envoyer les résultats immédiatement sendEventWithName?
Ou tout appel natif> JS nécessite-t-il un code asynchrone _bridge enqueueJSCall
?
fichier: MyNativeModule.m
// Use forwardEventWithName to forward events // processed by common cross-platform JS to the react native app RCT_EXPORT_METHOD(forwardEventWithName:(NSString*)name body:(NSString*)body) { [self sendEventWithName:name body:body]; } // 1 - react native app calls sendQueryToBluetoothDevice // 2 - device calls commandResponse when response received RCT_EXPORT_METHOD(sendQueryToBluetoothDevice:(NSString*)command { [_device sendCommand:command]; } // 1 - Receives XML response from external Bluetooth device // 2 - Sends XML to internal JS method for processing // 3 - Internal JS method uses forwardEventWithName // to send event to react native app - (void) commandResponse:(NSString *) xml { [self sendEventWithName:@"_processResponseInJavaScriptMethod" body:@{@"xml": configuration}]; }
fichier: index.js (module natif)
// Parse xml in common JS code for both Android and iOS native modules emitter.addListener("_processResponseInJavaScriptMethod", (e) => { const body = parseXml(e.xml); // ?? Is there a way to send event directly using JS to the react native app ?? // Hack - Call native method forwardEventWithName to sendEventWithName to react native app. /// // This makes two _bridge enqueueJSCall's // 1 - One call to sendEventWithName "_myNativeModuleInternalMethod" // 2 - Second call to sendEventWithName "myNativeModuleEvent MyNativeModule.forwardEventWithName( 'myNativeModuleEventResponseReceived', JSON.stringify(body)); } })
J'ai le module natif qui fonctionne. Je me trouve juste en train de dupliquer du code en Java et Objective C qui pourrait être réutilisé. Peut-être que j'ajouteListener dans le fichier index.js du module beridge et que je reçois le callback du code natif, traite les données, puis émet un évènement? reac-native-fetch-blob semble-t-il faire quelque chose comme ça? https://github.com/wkh237/react-native-fetch-blob –
Comment vous structurez cela dépend de vous. Vous avez des moyens pour natif d'envoyer des informations à JS et JS pour envoyer des informations à natif. – satya164
Merci. Existe-t-il une approche pour le code natif pour traiter les données de manière synchrone à l'aide d'un appel JS, puis envoyer les résultats immédiatement avec sendEventWithName? –