@ReactMethod用來(lái)修飾供JS調(diào)用的原生方法
JS的參數(shù)轉(zhuǎn)為JAVA的參數(shù)就是個(gè)問(wèn)題了,都有哪些類(lèi)型可以轉(zhuǎn)換?
在JavaMethodWrapper類(lèi)中的buildArgumentExtractors方法中做了判斷,源碼如下:
private ArgumentExtractor[] buildArgumentExtractors(Class[] paramTypes) {
ArgumentExtractor[] argumentExtractors =new ArgumentExtractor[paramTypes.length];
for (int i =0; i < paramTypes.length; i += argumentExtractors[i].getJSArgumentsNeeded()) {
Class argumentClass = paramTypes[i];
if (argumentClass == Boolean.class || argumentClass ==boolean.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_BOOLEAN;
}else if (argumentClass == Integer.class || argumentClass ==int.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_INTEGER;
}else if (argumentClass == Double.class || argumentClass ==double.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_DOUBLE;
}else if (argumentClass == Float.class || argumentClass ==float.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_FLOAT;
}else if (argumentClass == String.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_STRING;
}else if (argumentClass == Callback.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_CALLBACK;
}else if (argumentClass == Promise.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_PROMISE;
Assertions.assertCondition(
i == paramTypes.length -1,"Promise must be used as last parameter only");
}else if (argumentClass == ReadableMap.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_MAP;
}else if (argumentClass == ReadableArray.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_ARRAY;
}else if (argumentClass == Dynamic.class) {
argumentExtractors[i] =ARGUMENT_EXTRACTOR_DYNAMIC;
}else {
throw new RuntimeException(
"Got unknown argument class: " + argumentClass.getSimpleName());
}
}
return argumentExtractors;
}
從中可以清晰的看到,boolean,int,double,float,String這些java的基本值類(lèi)型都可以轉(zhuǎn),
其他可轉(zhuǎn)類(lèi)都是RN自己實(shí)現(xiàn)的,包括Callback,Promise,ReadableMap,ReadableArray,Dynamic類(lèi),其中比較常用的是
ReadableMap,ReadableArray,對(duì)應(yīng)java的Map和List,都有函數(shù)直接轉(zhuǎn)為HashMap和ArrayList,
Callback是回調(diào)方法,
Promise對(duì)應(yīng)JS的Promise方法,
Dynamic則是一個(gè)靈活類(lèi),這樣JS可以傳不用類(lèi)型的參數(shù),再由JAVA通過(guò)Dynamic的方法自己判斷是那種類(lèi)型的數(shù)據(jù)再做轉(zhuǎn)換。