Используйте собственный класс React в собственном проекте Android

#android #react-native

Вопрос:

У меня есть приложение среднего размера для Android и iOS, которое в настоящее время разрабатывается соответственно на Android Native (Java) и iOS Native (Swift). Я приближаюсь к React Native, чтобы использовать его для совместного использования некоторого кода между двумя приложениями, поскольку я не могу позволить себе переделать весь проект в React Native за один раз.

План состоит в том, чтобы начать с нескольких классов: менеджера, который обращается ко всем нашим конечным точкам, некоторым менеджерам, некоторым типам данных. Я пока не хочу делиться view, потому что они ИСПОЛЬЗУЮТ этот общий код, и мне пришлось бы поддерживать этих менеджеров в трех проектах.

Есть ли способ получить доступ к классам React Native, которые не являются представлениями (Android Activities / iOS ViewControllers), к Android Native?

Я пытался https://reactnative.dev/docs/integration-with-existing-apps и это работает, но это выглядит как прославленный WebView, где код в React Native скрыт. Если в машинном коде React у меня был какой-то простой класс, например:

 import React from 'react';
import type {Node} from 'react';


class Adder {
    add = (value) => {
        return value   10;
    }
}


export default Adder;
 

могу ли я каким-либо образом вызвать этот код на Java? :

 int value = new Adder().add(1); // Value == 11
 

Я использую неправильный инструмент для решения этой проблемы?

Ответ №1:

После некоторого опыта работы с расширениями (iOS) и Activities (Android) Я думаю, что ваше намерение на самом деле не подходит для React Native. React Native всегда основан на экране, ViewController в iOS и Activity в Android. Весь жизненный цикл React Native находится внутри этого экрана, и RN заботится о отображении содержимого. Когда вы находитесь внутри экрана RN, вы можете использовать все свои собственные функции с модулями и вызывать RN с собственной стороны. Уже сложно получить возвращаемое значение из вызова из native в RN (а не наоборот), поэтому ваш способ его интеграции, вероятно, затруднит его для вас, даже если вы обойдете всю логику отображения экрана.

Имея в виду эту идею, вы можете легко заменить отдельные экраны в своем приложении на (новый) экран RN. Вы вызываете их с помощью startActivity (Android) или presentViewController и тому подобное (iOS) и помещаете всю соответствующую логику в RN с возможным взаимодействием с некоторым старым машинным кодом.