Связь React native между React native и Android с помощью настраиваемого объекта

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

Мой код React Native-

const myModule = NativeModules.MyProcessor;

myModule.processData(obj1, obj2);

Мой код Android в MyProcessor.java -

@ReactMethod
    public void processData(final Object1 obj1, final Objet2 obj2) {
        //Do something here
    }

Мои данные объекта выглядят так -

"data1": {
                "id": "1",
                "name": "john",
                "key": "xxxxxxxx"
            },
            "details": {
                "detailId": "2",
                "detailName": "peter",
                "counter": 1
            }

Я получаю 2 объекта data1 и детали, из которых мне нужны оба, а также detailId.

Мой вопрос в том, как мне использовать эти 2 объекта в моем java?

Эти объекты готовы к использованию и переданы в качестве параметров. Я не мог понять, что вы имеете в виду, говоря, как мне использовать эти объекты.

Faruk Yazici 14.08.2018 15:17

Мне нужна посылка или что-то в этом роде, чтобы java это понимала

user9765778 14.08.2018 15:21

@ Джулия, проверь мой ответ .. Это именно то, что тебе нужно.

HedeH 14.08.2018 15:32
2
3
1 909
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вопрос:

How do I use these 2 objects Object1 and Object2 in my java?

Отвечать: Цитируется из здесь:

"The following argument types are supported for methods annotated with @ReactMethod and they directly map to their JavaScript equivalents"

Boolean -> Bool
Integer -> Number
Double -> Number
Float -> Number
String -> String
Callback -> function
ReadableMap -> Object
ReadableArray -> Array

React Native конвертирует объект javascript в ReadableMap.

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

@ReactMethod
public void processData(final ReadableMap obj1, final ReadableMap obj2) {
    // Parse the ReadableMap using the available interface methods
}

Это доступные методы в интерфейсе ReadableMap: Источник

public interface ReadableMap {

  boolean hasKey(String name);
  boolean isNull(String name);
  boolean getBoolean(String name);
  double getDouble(String name);
  int getInt(String name);
  String getString(String name);
  ReadableArray getArray(String name);
  ReadableMap getMap(String name);
  Dynamic getDynamic(String name);
  ReadableType getType(String name);
  ReadableMapKeySetIterator keySetIterator();
  HashMap<String, Object> toHashMap();
}

ОБНОВИТЬ

Следуя опубликованному вами примеру объекта, вы можете анализировать свои данные следующим образом:

ReadableMap data1 = obj1.getMap("data1");
String id = data1.getString("id");
String name = data1.getString("name");
// And so on...

ReadableMap details = obj1.getMap("details");
String detailId = details.getString("detailId");
int counter = details.getInt("counter");
// And so on...

Если вы хотите передать сложные объекты из React-Native в Android, вам следует использовать ReadableMap, который используется в мосте JavaScript и эквивалентен HashMap.

ReadableMap obj1

Затем вы можете передать это в HashMap и легко получить значения

HashMap map = (HashMap) obj1;
String field = map.get("key").toString();

Для конкретных значений, которые вы указали:

Получите data1 как другой HashMap из obj1:

HashMap details = (HashMap) map.get("details");

Прочтите строки из карты деталей:

String detailId = details.get("detailId").toString();

Зачем закидывать на HashMap? Для этого и нужен интерфейс ReadableMap ...

HedeH 14.08.2018 15:59

@HedeH ReadableMap реализован для React Native, раньше в Java его не было. Например, если вы собираетесь передать этот объект на другую страницу, вам потребуется еще один импорт из пакета react bridge, чтобы использовать его. Я обычно приводил его к HashMap для использования стандартных служебных объектов Java на каждой странице. Как я уже сказал, это просто соглашение о кодировании, решать вам.

Faruk Yazici 14.08.2018 16:13

Достаточно справедливо, но вопрос касается React Native .. И у React Native есть свои соглашения ... Вы бы использовали Log.d() при разработке для Android или System.out.println()? конечно Log.d() ....

HedeH 14.08.2018 16:19

Другие вопросы по теме