¿Cómo hace la interfaz ReadableMap en React-native convertir JS a JAVA?

Estoy tratando de entender cómo pasar correctamente las opciones desde el lado js de reaccionar-nativo al lado de java.

El puente de react-native utiliza ReadableMap para convertir pero como un noob de Java estoy fallando en entender cómo funciona esto.

Más específicamente no entiendo:

  • Cómo funciona la conversión real?
  • Cómo saber qué tipo / formato quiere el código Java de abajo?
  • ¿Cómo usar correctamente ReadableMap para hacer esto?

En general, me gustaría saber cómo funciona esto, pero voy a dar el ejemplo específico que estoy buscando para dar un poco de contexto.


Un paquete reactivo-nativo expone un selector de fecha y hora.

El lado JS tiene un método 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 se puentea a un método Java en el lado nativo:

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

Que llama

 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); } 

Que crea e instancia de un Android TimePicker . Mi objetivo es cambiar el estilo del Timepicker de reloj a spinner.

Hay un atributo XML configurable android:timePickerMode="spinner" pero no creo que pueda pasar un atributo XML a través de react-native ¿no?

También encontré una sugerencia en los comentarios para pasar defStyleAttr para hacer esto, pero no entiendo cómo.

En primer lugar, consulte la lista de tipos de argumentos del documento React Native para los módulos nativos de Android.

Tipos de argumentos

Los siguientes tipos de argumentos son compatibles con los métodos anotados con @ReactMethod y se asignan directamente a sus equivalentes de JavaScript

  • Booleano -> Bool
  • Número entero -> Número
  • Doble -> Número
  • Float -> Número
  • Cadena -> Cadena
  • Callback -> función
  • ReadableMap -> Objeto
  • ReadableArray -> Array

Por lo tanto, puede pasar el campo extra de timePickerMode como String al actualizar las options que el lado JS pasa para incluirlo.

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

Y luego obtener ese valor de la ReadableMap en su constructor personalizado TimePicker .

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

Ahora tiene el valor que desea establecer. Desafortunadamente, no parece que timePickerMode se puede establecer mediante programación. Esta pregunta de SO pregunta cómo hacerlo y @alanv (cuyo perfil indica que son un Ingeniero de Software en Google) indica que no es posible en tiempo de ejecución.

  • Reaccionar Android nativo no se puede cargar JS paquete
  • Cómo devolver un booleano de @ReactMethod en React Native?
  • Proyecto de la biblioteca de Android con React Native
  • Reaccionar Nativo Android Pantalla de bienvenida
  • ¿Cómo conseguimos que un fragmento de Android aparezca en react-native?
  • Ningún gestor de vistas definido para la clase RCTMap
  • Cómo actualizar el número de versión de la aplicación de reaccionar nativo
  • "Obtener el paquete JS" Monstruosamente lento
  • Error al llamar a RCTDeviceEventEmitter.emit en ReactNative
  • Reaccionar Nativo <Image> no cargar imagen de sdcard en android
  • ¿Reactiva Nativo Realmente Soporta Fragmentos Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.