この問題は数日間起き続けました。最後に、私は解決策を持っています。私はそれが将来誰かを助けることを願っています。このソリューションはKotlinにありますが、Javaに変換するのは簡単です。 someVariable!!
は "not null"アサーションで、大文字のSomeObject()
はインスタンスの作成、SomeType:SomeOtherType
は継承または実装、val someVar:SomeType
は変数宣言です。残りは同じです。
ステップ:
1)を実行し、あなたのRNランタイムにモジュールを挿入したい時に以下のコード。 Activity.onCreate()
またはFragment.onCreateView()
の中には良い候補がいくつかあります。 mReactInstanceManager
はあなたのシングルトンのグローバル・リアクション・ランタイムです。 packageToInject
の定義については後述する。 packageToInject
内部に保持
synchronized(mReactInstanceManager!!.currentReactContext!!) {
val nativeModuleRegistryBuilder = NativeModuleRegistryBuilder(
mReactInstanceManager!!.currentReactContext as ReactApplicationContext?,
mReactInstanceManager!!,
false
)
nativeModuleRegistryBuilder.processPackage(packageToInject)
mReactInstanceManager!!.currentReactContext!!.catalystInstance!!.extendNativeModules(nativeModuleRegistryBuilder.build())
}
2)インスタンスFragment
/Activity
インスタンスごとに一意の名前で一意モジュールを有するように以下のように調製されなければなりません。 Fragment
またはActivity
のこれらの内部クラスを作成します。あなたはどちらかあなたのActivity.onCreate()
やFragment.onCreateView()
でmReactRootView.startReactApplication()
を開始するとき
class ReactManagerPackage : ReactPackage {
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()
}
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
val modules = ArrayList<NativeModule>()
modules.add(ReactBridge(reactContext))
return modules
}
}
class ReactBridge(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
override fun getName(): String {
return myFragmentOrActivity.hashCode().toString()
}
@ReactMethod
fun showToast(text: String) {
Toast.makeText(text, Toast.LENGTH_SHORT).show()
}
}
3)は小道具としてmyFragmentOrActivity.hashCode().toString()
を渡します。第3引数としてmReactRootView.startReactApplication()
に与えるバンドルに入れてください。
val bundle = Bundle()
bundle.putString("fragmentOrActivityHash", myFragmentOrActivity.hashCode().toString())
mReactRootView.startReactApplication(mReactInstanceManager, "MyRootComponent", bundle)
4)あなたの特定のブリッジを取得するために)(コンポーネントでは、この例ではMyRootComponent
を小道具を使用してください。 (Javascript)
NativeModules[this.props.fragmentOrActivityHash].showToast("It works")
Profit!