2016-07-29 11 views
5

Zainteresowane implementowaniem bezpośrednich macierzystych na połączeń javascript w trybie macierzystym. Ale nie znalazłem żadnych wskazówek na ten temat.Czy są jakieś instrukcje dotyczące implementacji JavaScriptModule w trybie reakcji natywnej?

Proszę, pomóż z kilkoma przykładami tworzenia i rejestrowania natywnych dla modułów javascript w reakcji natywnej.


już zorientowali się, że kod z oficjalnej dokumentacji native modules android ma metodę nazwie createJSModules, która zwraca listę JavaScriptModule klas.

class AnExampleReactPackage implements ReactPackage { 

    @Override 
    public List<Class<? extends JavaScriptModule>> createJSModules() { 
    return Collections.emptyList(); 
    } 

    ... 

} 

Javadoc dla com.facebook.react.bridge.JavaScriptModule mówi:

/** 
* Interface denoting that a class is the interface to a module with the same name in JS. Calling 
* functions on this interface will result in corresponding methods in JS being called. 
* ... 
*/ 
@DoNotStrip 
public interface JavaScriptModule { 
} 

byłem w stanie stworzyć interfejs i przekazać to klasa createJSModules ale nie mam pojęcia jak się zarejestrować odpowiednie moduł javascript z kodu js.

Odpowiedz

5

Wreszcie, po patrząc na reakcję js źródeł, zorientowali się rozwiązanie, trzeba:

  1. Extend JavaScriptModule i przekazać go do createJSModules metoda zwyczaju reagować opakowaniu (np ActionsModule.java).
  2. Rejestrze, że pakiet w ciągu reagować aktywność getPackages lub bezpośrednio metodę myślał ReactInstanceManager
  3. Tworzenie js plik o takiej samej nazwie w kodzie js
  4. zarejestrować go BatchedBridge jak opisano w wykazie poniżej.
  5. niż po reagować kontekst inicjalizacji, można je dostać i wywołać poprzez:

    ActionsModule jsModule = context.getJSModule (ActionsModule.class); jsModule.callAction ("pozdrawiam", "cześć");

To wywoła asynchronicznie twoją zarejestrowaną metodę modułu js.


// AppPackage.java 
public class AppPackage implements ReactPackage { 

    @Override 
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
     return Collections.emptyList(); 
    } 

    @Override 
    public List<Class<? extends JavaScriptModule>> createJSModules() { 
     return Arrays.<Class<? extends JavaScriptModule>>asList(
       ActionsModule.class 
     ); 
    } 

    @Override 
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { 
     return Collections.emptyList(); 
    } 

} 

// ActionsModule.java 
public interface ActionsModule extends JavaScriptModule { 

    void callAction(String type, String value); 

} 

// MyReactActivity.java 
public class MyReactActivity extends ReactActivity implements ReactInstanceManager.ReactInstanceEventListener { 

    ... 

    @Override 
    public void onReactContextInitialized(ReactContext context) { 
     ActionsModule jsModule = context.getJSModule(ActionsModule.class); 

     jsModule.callAction("greet", "hello"); 
    } 

    ... 

} 

// ActionsModule.js 
var ActionsModule = { 

    callAction(type, value) { 
    console.log("callAction => " + type + ":" + value); 
    }, 

} 

module.exports = ActionsModule; 

// index.android.js 
import { 
    AppRegistry 
} from 'react-native'; 

import App from './components/App'; 

// js module registration 
var BatchedBridge = require('BatchedBridge'); 
var ActionsModule = require('./ActionsModule'); 

BatchedBridge.registerCallableModule(
    'ActionsModule', 
    ActionsModule 
); 
//~ js module registration 

AppRegistry.registerComponent('MyApp',() => App); 

UPD> pchnął projekt demo do GitHub roztworem zarówno dla Androida i iOS: https://github.com/dmba/rct-native2js

+0

BatchedBridge jest niezdefiniowany, jeśli spróbujesz zaimportować go z obiektu React. – Xiv

+1

Doskonałe rozwiązanie ~ Po prostu brakuje jakiegoś kodu w 'MyReactActivity'. Dodaj ten kod w nim. '@Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); getReactInstanceManager(). AddReactInstanceEventListener (this); } ' – JohnWatsonDev

+0

Jakieś pomysły, jak to zrobić w systemie iOS? Nie ma wzmianki o JSModules ani w dokumentach, ani w nagłówkach, które przeglądałem. Nie wierzę, że jest to funkcja jednoplatformowa. –

0

Nie jestem pewien, czy to możliwe, ale dlaczego miałbyś to robić? Użyj NativeAppEventEmitter/DeviceEventEmitter i po prostu wyślij go jako wydarzenie, którego będziesz słuchać po stronie JS.

+0

I'm obecnie za pomocą emiterów zdarzeń, ale było zainteresowani dodatkowymi sposobami natywnej komunikacji js, ponieważ istnieje interfejs API języka Java, który mówi, że faktycznie można uruchamiać metody interfejsu z języka Java za pośrednictwem serwera proxy z js impl ementacje. – Dmitry

+0

Chciałbym wiedzieć, czy to działa, głównie wykorzystuję obserwowalne dla tego rodzaju rzeczy. Możesz spróbować spojrzeć na kod źródłowy dla emitujących zdarzenia i zobaczyć, gdzie to cię czeka. – Rubys

Powiązane problemy