React Native Android – добавление новой ReactActivity для запуска другого пакета jsAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 React Native Android – добавление новой ReactActivity для запуска другого пакета js

Сообщение Anonymous »

Я пытаюсь сделать так, чтобы в моем Android-приложении React Native было еще одно действие, помимо MainActivity, которое могло запускать другой пакет js. Мне удалось добиться этого с помощью этой реализации:

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

import android.app.Activity
import android.os.Bundle
import com.facebook.react.ReactHost
import com.facebook.react.ReactRootView
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost

class MiniAppActivity : Activity() {
val TAG = "MiniAppActivity"
private lateinit var reactRootView: ReactRootView
private lateinit var reactHost: ReactHost

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val miniHost = MiniReactNativeHost(application)
reactHost = getDefaultReactHost(applicationContext, miniHost)
reactRootView = ReactRootView(this)
reactRootView.startReactApplication(
miniHost.reactInstanceManager,
"MiniApp", // name from AppRegistry.registerComponent()
null
)
setContentView(reactRootView)
}

override fun onPause() {
super.onPause()
reactHost.onHostPause(this)
}

override fun onResume() {
super.onResume()
reactHost.onHostResume(this)
}

override fun onDestroy() {
super.onDestroy()
reactHost.onHostDestroy(this)
}
}
с классом MiniReactNativeHost:

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

import android.app.Application
import com.facebook.react.PackageList
import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultReactNativeHost
import com.myapp.config.ConfigReaderPackage
import com.myapp.intent_launcher.IntentLauncherPackage

class MiniReactNativeHost(app: Application) : DefaultReactNativeHost(app) {

override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG

override fun getJSMainModuleName(): String = "index.mini" // if dev mode

override fun getBundleAssetName(): String = "index.mini.bundle" // mini bundle name

override fun getPackages(): List =
PackageList(this).packages.apply {
add(ConfigReaderPackage())
add(IntentLauncherPackage())
}

override fun getJSBundleFile(): String {
return "assets://index.mini.bundle"
}

override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
Приведенный выше код работает, но только на старой архитектуре. В новой архитектуре новый пакет загружается, но приложение выдает ошибку времени выполнения:

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

FATAL EXCEPTION: mqt_native_modules
Process: com.myapp.local, PID: 15645
java.lang.RuntimeException: Could not invoke UIManager.createView
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:381)
at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:146)
at com.facebook.jni.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.kt:20)
at android.os.Looper.loopOnce(Looper.java:211)
at android.os.Looper.loop(Looper.java:300)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.startNewBackgroundThread$lambda$1(MessageQueueThreadImpl.kt:175)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.$r8$lambda$ldnZnqelhYFctGaUKkOKYj5rxo4(Unknown Source:0)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at java.lang.Thread.run(Thread.java:1012)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:146) 
at com.facebook.jni.NativeRunnable.run(Native Method) 
at android.os.Handler.handleCallback(Handler.java:942) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.kt:20) 
at android.os.Looper.loopOnce(Looper.java:211) 
at android.os.Looper.loop(Looper.java:300) 
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.startNewBackgroundThread$lambda$1(MessageQueueThreadImpl.kt:175) 
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.$r8$lambda$ldnZnqelhYFctGaUKkOKYj5rxo4(Unknown Source:0) 
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0) 
at java.lang.Thread.run(Thread.java:1012) 
Caused by: java.lang.AssertionError: Root node with tag 31 doesn't exist
at com.facebook.infer.annotation.Assertions.assertNotNull(Assertions.java:19)
at com.facebook.react.uimanager.UIImplementation.createView(UIImplementation.java:251)
at com.facebook.react.uimanager.UIManagerModule.createView(UIManagerModule.java:438)
at java.lang.reflect.Method.invoke(Native Method) 
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372) 
at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:146) 
at com.facebook.jni.NativeRunnable.run(Native Method) 
at android.os.Handler.handleCallback(Handler.java:942) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.kt:20) 
at android.os.Looper.loopOnce(Looper.java:211) 
at android.os.Looper.loop(Looper.java:300) 
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.startNewBackgroundThread$lambda$1(MessageQueueThreadImpl.kt:175) 
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.$r8$lambda$ldnZnqelhYFctGaUKkOKYj5rxo4(Unknown Source:0) 
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0) 
at java.lang.Thread.run(Thread.java:1012) 
Поэтому я переключаюсь на ReactActivity, как и MainActivity:

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

import com.facebook.react.ReactActivity
import com.facebook.react.ReactHost
import com.facebook.react.defaults.DefaultReactHost

class NewMiniAppActivity : ReactActivity() {
private val TAG = "MiniAppActivity"

override fun getMainComponentName(): String = "MiniApp" // must match AppRegistry.registerComponent()

override fun getReactHost(): ReactHost {
val app = application as MainApplication
return DefaultReactHost.getDefaultReactHost(applicationContext, app.miniReactNativeHost)
}
}
Эта реализация выдает еще одну ошибку времени выполнения:

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

FATAL EXCEPTION: mqt_v_native
Process: com.myapp.local, PID: 17008
com.facebook.react.common.JavascriptException: Invariant Violation: "MiniApp" has not been registered.  This can happen if:
* Metro (the local dev server) is run from the wrong folder. Check if Metro is running, stop it and restart it in the current project.
* A module failed to load due to an error and `AppRegistry.registerComponent` wasn't called., js engine: hermes, stack:
invariant@1:49453
runApplication@1:336716

at com.facebook.react.modules.core.ExceptionsManagerModule.reportException(ExceptionsManagerModule.kt:52)
at com.facebook.jni.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.kt:20)
at android.os.Looper.loopOnce(Looper.java:211)
at android.os.Looper.loop(Looper.java:300)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.startNewBackgroundThread$lambda$1(MessageQueueThreadImpl.kt:175)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.$r8$lambda$ldnZnqelhYFctGaUKkOKYj5rxo4(Unknown Source:0)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at java.lang.Thread.run(Thread.java:1012)
Я пробовал много способов, но результат все тот же. Однако, если я изменю имя компонента с «MiniApp» на имя основного приложения, новое действие перестанет выдавать сбой, поскольку используется пакет по умолчанию. Это заставляет меня думать, что переопределенный метод getReactHost в подклассе ReactActivity не подействовал.
Я проверяю класс ReactActivity и вижу следующее:

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

public abstract class ReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler, PermissionAwareActivity {
private final ReactActivityDelegate mDelegate = this.createReactActivityDelegate();

protected ReactActivity() {
}

@Nullable
protected String getMainComponentName() {
return null;
}

protected ReactActivityDelegate createReactActivityDelegate() {
return new ReactActivityDelegate(this, this.getMainComponentName());
}
ChatGpt предполагает, что ReactActivityDelegate создается при инициации суперкласса, поэтому все, что я переопределяю в своем подклассе, не будет работать.
Кто-нибудь пробовал делать такое раньше? Поделитесь, если что-то знаете! Спасибо!
PS: Похоже, в новой версии требуется ReactActivity. Я столкнулся с такой ошибкой при использовании Activity или AppCompatActivity, но забыл записать трассировку стека.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -js-bundle
Ответить

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

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

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

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

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