2017-11-14 5 views
2

私はAndroidを使用してリアクションネイティブのカスタムコンポーネントを実装しています。 Reactネイティブから実行可能な関数を実装したいと思います。私は@ReactMethod注釈があることを見出したが、それは私が拡張するクラスでそれを使用する場合にのみリアクトによって考慮される:ネイティブエクスプレッションメソッドに反応する

は、しかし、私のニーズが異なっている

ReactContextBaseJavaModule。私は自分のコンポーネントで関数を実行する必要があります。私は拡張私のクラスで@ReactNativeアノテーションで機能を公開しようとしていた。

ViewGroupManager

が、全く反応のために、この機能は表示されません。 ReactContextBaseJavaModuleオブジェクトからViewGroupManagerオブジェクトにアクセスする可能性はありますか?ネイティブコンポーネントからReactNativeに関数を公開する最も便利な方法は何ですか?私は反応するから両方showToastとconnectToRoomの機能を実行することが可能だ

public class VidyoModule extends ReactContextBaseJavaModule { 

    public VidyoModule(ReactApplicationContext reactContext) { 
     super(reactContext); 
    } 

    @Override 
    public String getName() { 
     return "RNTVideoManager"; 
    } 

    @ReactMethod 
    public void showToast(){ 
     Toast.makeText(getCurrentActivity(), "Test", Toast.LENGTH_SHORT).show(); 
    } 


    @ReactMethod 
    public void connectToRoom(){ 

    } 
} 

は、ここに私のReactContextBaseJavaModule実装です。ここで

はViewGroupManagerの実装です:

public class VidyoComponentManager extends ViewGroupManager<VidyoView> { 
    private static final String COMPONENT_NAME = "RNTVideo"; 

    public VidyoComponentManager(){ 
    } 

    @Override 
    public String getName() { 
     return COMPONENT_NAME; 
    } 

    @Override 
    protected VidyoView createViewInstance(ThemedReactContext reactContext) { 
     return new VidyoView(reactContext); 
    } 

    @ReactMethod 
    public void connectToRoom(){ 

    } 
} 

私ReactPackageは、次のようになります。

public class VidyoPackage implements ReactPackage { 

    @Override 
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
     List<NativeModule> modules = new ArrayList<>(); 
     VidyoModule module = new VidyoModule(reactContext); 
     modules.add(module); 
     return modules; 
    } 

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

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

この場合には、機能connectToRoomはReactNativeため表示されません。私はここで何をすべきですか?私はコマンドを使うべきですか?

public Map<String, Integer> getCommandsMap() { 
    return MapBuilder.<String, Integer>builder() 
      .put("connectToRoom", 1) 
      .build(); 
} 

答えて

0

解決策が見つかりました。ネイティブ我々は任意のより良い解決策がある場合に、それらとして利用可能な機能は、サイド

const commands = NativeModules.UIManager.RNTVideo.Commands; 

Object.keys(commands).forEach(command => { 
    NativeModules.RNTVideoManager[command] = (handle, ...rawArgs) => { 
    const args = rawArgs.map(arg => { 
     if (typeof arg === 'function') { 
     callbackMap.set(nextCallbackId, arg); 
     return nextCallbackId++; 
     } 
     return arg; 
    }); 
    NativeModules.UIManager.dispatchViewManagerCommand(handle, commands[command], args); 
    }; 
}); 

に反応するコマンドと「registrate」を反復処理よりも、getCommandsMapを実装する必要が反応するようにViewManager(アンドロイド側)から機能を見えるようにするに教えてください約:

関連する問題