Поэтому я пытаюсь разработать приложение для Android с помощью React-Native, которое использует обнаружение позы Google ML Kit. Я все еще в начале этого проекта, но моя первая цель — запустить приложение и посмотреть, работает ли распознавание позы. По этой причине мне нужны камера Reaction-native-Vision и пакет React-Native-Worklets-Core для процессора кадров. Просто чтобы вы знали: в App.tsx я использую процессор кадров следующим образом:
//[...]
const frameProcessor = useFrameProcessor((frame: any) => {
'worklet';
const poseObject = objectDetect(frame);
//[...]
и взамен включил его в компонент Camera:
return (
<>
<Camera
frameProcessor = {frameProcessor}
style = {StyleSheet.absoluteFill}
device = {device}
isActive = {true}
/>
//[...]
В настоящее время я все еще работаю с эмулятором Android Studio. Я сделал все, как описано в инструкциях React-Native-Vision-Camera и -Worklets-core, и сборка всегда проходит успешно, но приложение выдает следующий код ошибки в эмуляторе:
Uncaught Error
Frame Processors are not available, react-native-worklets-core is not installed! Error: TurboModuleRegistry.getEnforcing(...): 'Worklets' could not be found. Verify that a module by this name is registered in the native binary.
Bridgeless mode: false. TurboModule interop: false. Modules loaded:
{"NativeModules":["PlatformConstants","LogBox","Timing","AppState","SourceCode","BlobModule","WebSocketModule","DevSettings","DevToolsSettingsManager","Networking","Appearance","DevLoadingView","HeadlessJsTaskSupport","UIManager","DeviceInfo","ImageLoader","SoundManager","IntentAndroid","DeviceEventManager","RNGestureHandlerModule","I18nManager","ReanimatedModule"],"TurboModules":[],"NotFound":["NativePerformanceCxx","NativePerformanceObserverCxx","RedBox","BugReporting","LinkingManager","Worklets"]}
Дело в том, что я уже установил Worklets-Core!
Мои зависимости в package.json:
"dependencies": {
"metro-react-native-babel-preset": "^0.77.0",
"react": "18.2.0",
"react-native": "0.73.6",
"react-native-gesture-handler": "^2.14.0",
"react-native-reanimated": "^3.6.2",
"react-native-svg": "^15.3.0",
"react-native-vision-camera": "^4.0.5",
"react-native-worklets-core": "^1.3.3"
},
И зависимости в build.gradle:
dependencies {
implementation("com.facebook.react:react-android")
implementation("com.facebook.react:react-native:+")
implementation("com.facebook.soloader:soloader:0.10.3")
implementation 'com.google.mlkit:pose-detection:18.0.0-beta4'
implementation 'com.google.mlkit:pose-detection-accurate:18.0.0-beta4'
implementation 'com.google.mlkit:vision-common:17.0.0'
implementation 'com.google.mlkit:vision-interfaces:16.0.0'
implementation 'com.google.mlkit:camera:16.0.0-beta3'
implementation 'androidx.annotation:annotation:1.3.0'
implementation 'com.google.android.gms:play-services-tasks:18.0.0'
implementation 'com.android.support:multidex:1.0.3'
implementation project(':react-native-gesture-handler')
implementation project(':react-native-vision-camera')
implementation project(':react-native-svg')
implementation project(':react-native-worklets-core')
if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
} else {
implementation jscFlavor
}
}
И мои конфигурации Babel:
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
'@babel/plugin-proposal-class-properties',
'@babel/plugin-transform-private-methods',
'@babel/plugin-transform-flow-strip-types',
'@babel/plugin-transform-runtime',
'@babel/plugin-transform-arrow-functions',
['react-native-worklets-core/plugin'],
['react-native-reanimated/plugin', { globals: ['__poseDetection'] }],
],
};
Я что-то пропустил? Есть ли отсутствующий импорт, о котором я не знаю?
Я уже несколько раз удалил node_modules и снова установил зависимости, но ошибка все та же.
Я проверил другие версии Vision-Camera и Worklets-Core, но все, кроме V4 для Vision-Camera и V1 для Worklets-Core, приводит к проблемам совместимости с другими зависимостями. Для всего остального: та же ошибка
Я пробовал вручную связать ядро рабочих листов с камерой Vision, но для версии 1.x.x связывание отключено, поскольку, по словам разработчиков, оно делает это автоматически.
Я попытался использовать Worklets-Core как одноранговую зависимость вместо стандартной зависимости. На самом деле это приводит к тому, что Gradle не может создать приложение. Я получаю ошибку:
> Could not resolve all task dependencies for configuration ':classpath'.
> Could not find com.facebook.react:react-native-gradle-plugin:.
Required by:
project :
При использовании в качестве стандартной зависимости gradle может найти путь к классам.
include ':react-native-worklets-core'
project(':react-native-worklets-core').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-worklets-core/android')
Никаких изменений вообще
попробуйте добавить следующую строку в массив плагинов Babel.config.js. Это должно включить рабочие модули в вашем приложении React Native. ИЛИ попробуйте связать свой проект с пакетом рабочих листов, но привязка вручную невозможна в ответном нативном режиме, но вы просто попробуйте один раз
react-native link react-native-worklets-core
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
'@babel/plugin-proposal-class-properties',
'@babel/plugin-transform-private-methods',
'@babel/plugin-transform-flow-strip-types',
'@babel/plugin-transform-runtime',
'@babel/plugin-transform-arrow-functions',
['react-native-worklets-core/plugin'],
['react-native-worklets-core/inline-requires'], // Add this line
['react-native-reanimated/plugin', { globals: ['__poseDetection'] }],
],
};
Спасибо за совет, но, к сожалению, это приводит к неудачной сборке: Error: Cannot find module 'react-native-worklets-core/inline-requires'
И к связыванию вручную: как я уже сказал, я уже пробовал, но терминал выдает мне ответ, что «ссылка» не существует как команда: После набрав «npx response-native link response-native-worklets-core», я получаю ответ: ``` ошибка: неизвестная команда 'link' ```
Итак, я наконец понял это:
Ошибка состоит из 2 частей:
В первую часть: вставка «import 'react-native-worklets-core»;' в App.tsx, как я уже упоминал в своем комментарии, приводит к решению этой части.
Ко второй части: мой импорт MainApplication.kt не был завершен. К сожалению, я не разместил их здесь, но я забыл строки импорта «import com.worklets.WorkletsPackage» и сам пакет для React, где также указан «MainReactPackage»:
override fun getPackages(): List<ReactPackage> {
return Arrays.asList<ReactPackage>(
MainReactPackage(),
PoseDetectionPackage(),
RNGestureHandlerPackage(),
ReanimatedPackage(),
CameraPackage(),
SvgPackage(),
WorkletsPackage() //This one
)
}
Возможно, вторая часть этого исправления также решает первую часть, но я только что попробовал несколько вещей, и эти шаги решили для меня всю проблему.
Я не знаю, сделал ли я что-то здесь, но я только что импортировал Worklets-Core в App.tsx с помощью команды «import 'react-native-worklets-core';». С тех пор не говорится, что Worklets-Core не установлено, но я все равно получаю сообщение об ошибке. Пишет: «Не удалось найти рабочие модули».