Как интерфейс ReadableMap в React-native конвертирует JS в JAVA?

Я пытаюсь понять, как правильно передавать параметры со стороны js реакции-native на сторону java.

Мост с поддержкой реакции использует ReadableMap для преобразования, но как Java noob, я не понимаю, как это работает.

Точнее я не понимаю:

  • Как работает фактическое преобразование?
  • Как узнать, какой тип / формат хочет использовать Java-код вниз по течению?
  • Как правильно использовать ReadableMap для этого?

В общем, я хотел бы знать, как это работает, но я приведу конкретный пример, на который я смотрю, чтобы дать некоторый контекст.


Компонент, отвечающий требованиям, предоставляет сборщик данных.

Сторона JS имеет метод showTimePicker:

showTimePicker(date, callback) { date = date || new Date(); console.log(this.props); debugger var options = { ...this.props, hour:date.getHours(), minute:date.getMinutes() }; RCTDateTimePicker.showTimePicker(options, function (hour, minute) { date.setHours(hour); date.setMinutes(minute); callback(date); }); } 

RCTDateTimePicker.showTimePicker к Java- методу с RCTDateTimePicker.showTimePicker стороны:

 @ReactMethod public void showTimePicker(ReadableMap options, Callback callback) { DialogFragment timePicker = new TimePicker(options, callback); timePicker.show(activity.getFragmentManager(), "timePicker"); } 

Который вызывает

 public TimePicker(ReadableMap options, Callback callback) { final Calendar c = Calendar.getInstance(); this.callback = callback; hour = options.hasKey("hour") ? options.getInt("hour") : c.get(Calendar.HOUR_OF_DAY); minute = options.hasKey("minute") ? options.getInt("minute") : c.get(Calendar.MINUTE); } 

Который создает и экземпляр Android TimePicker . Моя цель – изменить стиль Timepicker от watch to spinner.

Существует настраиваемый атрибут XML android:timePickerMode="spinner" но я не думаю, что могу передать атрибут XML через native-native, могу ли я?

Я также нашел предложение в комментариях, чтобы передать defStyleAttr для этого, но я не понимаю, как это сделать.

Во-первых, просмотрите список типов аргументов из документа «Реальный исходный» для собственных модулей Android.

Типы аргументов

Следующие типы аргументов поддерживаются для методов, аннотированных с помощью @ReactMethod, и они непосредственно сопоставляются с их эквивалентами JavaScript

  • Boolean -> Bool
  • Целое число -> Число
  • Double -> Number
  • Float -> Number
  • Строка -> Строка
  • Функция обратного вызова ->
  • ReadableMap -> Объект
  • ReadableArray -> Массив

Таким образом, вы можете передать дополнительное поле для timePickerMode как String, обновив options которые сторона JS передает, чтобы включить его.

 var options = { ...this.props, hour:date.getHours(), minute:date.getMinutes(), timePickerMode:"spinner" }; 

А затем получите это значение из ReadableMap в вашем пользовательском конструкторе TimePicker .

 String timePickerMode = options.hasKey("timePickerMode") ? options.getString("timePickerMode") : defaultTimePickerMode; 

Теперь у вас есть значение, которое вы хотите установить. К сожалению, не кажется, что timePickerMode может быть установлен программно. Этот вопрос SO задает вопрос, как это сделать, и @alanv (чей профиль указывает, что он является инженером-программистом в Google) указывает, что это невозможно во время выполнения.