Вызов нативной функции из TypeScript в реагирующем - PullRequest
0 голосов
/ 08 февраля 2020

В последнее время мне нужна была простая функция для взаимодействия с нативным кодом, но я решил не создавать пакет, потому что он не будет очень полезным. Я создал файлы java точно так же, как если бы они были из плагина, и зарегистрировал их в MainApplication.

Я использую машинопись, поэтому сейчас я борюсь с взаимодействием от rn до java. Я попытался с файлом js следующим образом:

import NativeModules from 'react-native';
const AndroidService = NativeModules;
export default { AndroidService }

Но затем я должен определить типы (сообщение из кода):

Property 'play' does not exist on type '{ AndroidService: typeof import("/home/karol/Git/TailosiveHub-react/node_modules/@types/react-native/index"); }'.

Я попытался создать index.d.ts файл в root проекта, но это не работает.

Как определить типы для собственного модуля в машинописи?

MainApplication:

@Override
protected List<ReactPackage> getPackages() {
    @SuppressWarnings("UnnecessaryLocalVariable")
    List<ReactPackage> packages = new PackageList(this).getPackages();
    // Packages that cannot be autolinked yet can be added manually here, for example:
    // packages.add(new MyReactNativePackage());
    packages.add(new AndroidServicePackage());
    // packages.add(new MainReactPackage());
    return packages;
}

AndroidServicePackage:

@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
  return Arrays.<NativeModule>asList(new AndroidServiceModule(reactContext));
}

AndroidServiceModule:

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

Метод:

@ReactMethod
public void play(String streamingURL/*, ReadableMap options*/) {
  doSomething();
}

Ответы [ 3 ]

1 голос
/ 09 февраля 2020

Импорт NativeModules содержит собственные модули внутри, поэтому вам просто нужно извлечь модуль AndroidService как свойство.

import NativeModules from 'react-native';
const { AndroidService } = NativeModules
export default { AndroidService }

В качестве альтернативы вы можете просто экспортировать его следующим образом:

import NativeModules from 'react-native';
exports.default = NativeModules.AndroidService;

Это должно дать вам желаемый результат, при условии, что у вас есть соответствующий собственный модуль с именем AndroidService, добавленный в пакет, предоставленный React Native.

Взято из Реагирует на документацию Native по родным модулям

0 голосов
/ 10 февраля 2020

Я исправил это, исправив мой импорт в файле плагина ts. Теперь это выглядит так:

import { NativeModules } from 'react-native';
const AndroidService = NativeModules.AndroidService;
export default AndroidService;
0 голосов
/ 10 февраля 2020

Вы должны добавить скобки вокруг своего назначения к AndroidService примерно так (это называется деструктуризацией):

import { NativeModules } from 'react-native'; 
export const { AndroidService } = NativeModules

Затем в другом файле вы можете использовать его следующим образом:

import { AndroidService } from 'path/to/exporting/file';

...

AndroidService.play("YOUR_URL"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...