2016-07-21 9 views
5

Próbuję zrozumieć, jak poprawnie przekazać opcje od strony js reakcji-native do strony Java.w jaki sposób interfejs ReadableMap w React-native konwertuje JS na JAVA?

Natywny mostek używa ReadableMap do konwersji, ale jako Java noob nie rozumiem, jak to działa.

Dokładniej nie rozumiem:

  • w jaki sposób rzeczywiste prace konwersji?
  • jak określić typ/format wymagany przez kod Java podrzędny?
  • jak prawidłowo użyć ReadableMap, aby to zrobić?

Generalnie chciałbym wiedzieć, jak to działa, ale podam konkretny przykład, na który patrzę, aby podać kontekst.


Natywny pakiet reaguje na próbnik datetime.

JS strona posiada metodę 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 jest zmostkowany z Java method na rodzimej strony:

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

który wzywa

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

który tworzy i wystąpienie Androida TimePicker. Moim celem jest zmiana stylu Timepicker z zegarka na spinner.

Istnieje możliwy do ustawienia atrybut XML android:timePickerMode="spinner", ale myślę, że nie mogę przekazać atrybutu XML poprzez reakcję natywną, czy mogę?

Znalazłem również sugestię w komentarzach do przekazania defStyleAttr, aby to zrobić, ale nie rozumiem w jaki sposób.

Odpowiedz

6

Najpierw zobacz listę Argument Types z React Native document for Android Native Modules.

typy argumentów

następujące typy argumentów są obsługiwane dla metod opatrzone @ReactMethod i oni bezpośrednio mapować do ich JavaScript ekwiwalentów

  • Boolean -> Bool
  • Integer -> Numer
  • Podwójny -> Numer
  • Float -> Ilość
  • String -> String
  • oddzwaniania -> funkcja
  • ReadableMap -> Object
  • ReadableArray -> Array

Więc może przekazać dodatkowe dla zmiennej timePickerMode poprzez aktualizację options, którą strona JS przechodzi, aby ją uwzględnić.

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

a następnie uzyskać tę wartość od ReadableMap w konstruktorze zwyczaj TimePicker.

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

Teraz masz wartość, którą chcesz ustawić. Niestety nie wydaje się, że można ustawić programowo timePickerMode. This SO question pyta, jak to zrobić, a @alanv (którego profil wskazuje, że jest inżynierem oprogramowania w Google) wskazuje, że nie jest to możliwe w środowisku wykonawczym.

+0

okrzyki, dzięki za dogłębną odpowiedź – funkyeah

Powiązane problemy