Reaction-native: Как получить доступ к библиотекам реагировать-на-роде из представления JS, отображаемого внутри собственного модуля Android - PullRequest
1 голос
/ 26 марта 2019

Я создал собственное приложение, которое при нажатии кнопки загрузит собственный модуль Android.При вызове нативный модуль запускает действие Android, которое использует класс Presentation (наряду с https://github.com/commonsguy/cwac-presentation) для управления вторым дисплеем монитора (chromecast, miracast и т. Д.). У меня все это работает отлично.

Следующим этапом было использование собственного модуля для отображения собственного представления на 2-м мониторе, и я смог добиться этого с помощью ReactRootView и ReactInstanceManager (https://facebook.github.io/react-native/docs/integration-with-existing-apps). Собственный модуль Android загружаетответное собственное представление из корневого реактивного приложения.

mReactRootView = new ReactRootView(activity);
mReactInstanceManager = ReactInstanceManager.builder().setApplication(activity.getApplication())
                .setCurrentActivity(activity).setBundleAssetName("index.android.bundle").setJSMainModulePath("index")
                .addPackage(new MainReactPackage()).setUseDeveloperSupport(true)
                .setInitialLifecycleState(LifecycleState.RESUMED).build();

group.addView(mReactRootView);
mReactRootView.startReactApplication(mReactInstanceManager, "JsPresentationView", getLaunchOptions());

(где "JsPresentationView" - это имя отображаемого собственного реагирующего представления)

в то время как реагирующее собственноепредставление отображается на экране презентации, на экране мобильного устройства отображается представление Android, которое использует RCTDeviceEventEmitter для отправки событий в собственный таймер реагирования, например, для воспроизведения / приостановки просмотра таймера:

ReactInstanceManager displayInstanceManager = reactFragmentPresentation.getInstanceManager();

ReactContext displayContext = displayInstanceManager.getCurrentReactContext();

displayContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("TogglePlayback",
                    displayParams);

(Где 'TogglePlayback' - это имя события, которое должно быть запущено для отображения в режиме реакции)

Проблема, с которой я столкнулсяd пытается получить доступ к собственным библиотекам реагирования, импортированным в корневое приложение собственного реагирования, из представления реагирующего натива, загруженного ReactRootView.Я могу получить доступ к основной реагирующей нативной библиотеке для основной реагирующей нативной функциональности, но любой другой импорт всегда возвращается как ноль.Например, я пытаюсь использовать «act-native-audio-toolkit »для воспроизведения музыки с помощью реагирующего нативного представления на втором экране.

import { Player } from "react-native-audio-toolkit";

Выдает эту ошибку: Экран реактивной ошибки. Поскольку у реактивного представления был доступ к главной библиотеке реактивной, я начал думать, что эти проблемывызывается моим build.gradle в моем native-модуле:

buildscript {
    repositories {
        jcenter()
        google()
        maven {
            url "http://repo.commonsware.com"
        }
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
    }
}

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28

    buildToolsVersion "28.0.3"

    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    lintOptions {
        abortOnError false
    }
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }
}


repositories {
    mavenCentral()
    google()
    jcenter()
    maven {
        url "http://repo.commonsware.com"
    }
    maven {
        url "$rootDir/../example/node_modules/react-native/android"
    }
    maven {
        url "$rootDir/../example/node_modules/react-native-audio-toolkit/android"
    }
    maven {
        url 'https://maven.google.com/'
        name 'Google'
    }
}

dependencies {
    implementation 'com.facebook.react:react-native:+'
    implementation 'com.commonsware.cwac:layouts:0.4.4'
    implementation 'com.commonsware.cwac:presentation:0.5.3'
    implementation 'com.google.android.exoplayer:exoplayer-core:2.9.0'
    implementation fileTree(dir: "libs", include: ["*.jar"])
}

allprojects {
    repositories {
        maven {
            url "$rootDir/../example/node_modules/react-native/android"
        }
        maven {
            url "$rootDir/../example/node_modules/react-native-audio-toolkit/android"
        }
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
}
subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 28
                buildToolsVersion "28.0.3"
            }
        }
    }
}

(Пример каталога выше - это расположение приложенияact-native, которое будет импортировать native-модуль из $ rootDir)

Я пробовал много разных обновлений для build.gradle, чтобы включить библиотекуact-native-audio-toolkit, но я не уверен, является ли это истинным корнем проблемы.Кто-нибудь знает, если я что-то упустил из build.gradle выше, чтобы переслать реагирующие нативные библиотеки в представленное реагирующее представление?Или, если то, чего я пытаюсь достичь, вообще возможно?

Я думаю, что я мог бы обойти эту проблему, разделив представление презентации-реакции на собственный проект-реакции - но я бы хотел оставить это втот же проект, если это возможно.

...