¿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.
- Grueso borde / borde negro alrededor de una aplicación React Native en Android
- Manejo del botón de retroceso en React Native, Navigator en Android
- Error: <identifier> esperado usando y
- ¿Cómo obtener un nombre de versión en la aplicación de reactivo nativo en Android?
- React Native - TouchableOpacity no funciona dentro de una posición absoluta View
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.
- React-Native El nivel de API Android más bajo
- Error: No se puede encontrar el archivo con path: prelude_dev.js
- No se puede crear la aplicación de reactivo nativo en el dispositivo Android: no se pudo encontrar el destino con la cadena de hash 'android-23'
- Tipo de error 3. La clase de actividad {com.awesome_project / com.awesome_project.MainActivity} no existe en react native (dispositivo Android)
- Error "No se pudo obtener BatchedBridge, asegúrese de que su paquete se empaqueta correctamente" al inicio de la aplicación
- ¿Flexbox en React Native usa dp o pixel?
- Cmd: reaccionar-nativo run-android en cada cambio de archivo
- React-native android fontFamily no tiene efecto
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.