下面列出了怎么用com.facebook.react.bridge.ReadableType的API类实例代码及写法,或者点击链接到github查看源代码。
void setFromDynamic(Dynamic dynamic) {
if (dynamic.isNull()) {
unit = YogaUnit.UNDEFINED;
value = YogaConstants.UNDEFINED;
} else if (dynamic.getType() == ReadableType.String) {
final String s = dynamic.asString();
if (s.equals("auto")) {
unit = YogaUnit.AUTO;
value = YogaConstants.UNDEFINED;
} else if (s.endsWith("%")) {
unit = YogaUnit.PERCENT;
value = Float.parseFloat(s.substring(0, s.length() - 1));
} else {
throw new IllegalArgumentException("Unknown value: " + s);
}
} else {
unit = YogaUnit.POINT;
value = PixelUtil.toPixelFromDIP(dynamic.asDouble());
}
}
public static String format(String message, ReadableArray stack) {
StringBuilder stringBuilder = new StringBuilder(message).append(", stack:\n");
for (int i = 0; i < stack.size(); i++) {
ReadableMap frame = stack.getMap(i);
stringBuilder
.append(frame.getString("methodName"))
.append("@")
.append(stackFrameToModuleId(frame))
.append(frame.getInt("lineNumber"));
if (frame.hasKey("column") &&
!frame.isNull("column") &&
frame.getType("column") == ReadableType.Number) {
stringBuilder
.append(":")
.append(frame.getInt("column"));
}
stringBuilder.append("\n");
}
return stringBuilder.toString();
}
public void testGetTypeFromArray() {
mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class)
.returnArrayWithStringDoubleIntMapArrayBooleanNull();
waitForBridgeAndUIIdle();
List<ReadableArray> calls = mRecordingTestModule.getArrayCalls();
assertEquals(1, calls.size());
ReadableArray array = calls.get(0);
assertEquals(ReadableType.String, array.getType(0));
assertEquals(ReadableType.Number, array.getType(1));
assertEquals(ReadableType.Number, array.getType(2));
assertEquals(ReadableType.Map, array.getType(3));
assertEquals(ReadableType.Array, array.getType(4));
assertEquals(ReadableType.Boolean, array.getType(5));
assertEquals(ReadableType.Null, array.getType(6));
}
public void testIntOutOfRangeThrown() {
mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class).returnArrayWithLargeInts();
mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class).returnMapWithLargeInts();
waitForBridgeAndUIIdle();
assertEquals(1, mRecordingTestModule.getArrayCalls().size());
assertEquals(1, mRecordingTestModule.getMapCalls().size());
ReadableArray array = mRecordingTestModule.getArrayCalls().get(0);
assertNotNull(array);
ReadableMap map = mRecordingTestModule.getMapCalls().get(0);
assertNotNull(map);
assertEquals(ReadableType.Number, array.getType(0));
assertUnexpectedTypeExceptionThrown(array, 0, "int");
assertEquals(ReadableType.Number, array.getType(1));
assertUnexpectedTypeExceptionThrown(array, 1, "int");
assertEquals(ReadableType.Number, map.getType("first"));
assertUnexpectedTypeExceptionThrown(map, "first", "int");
assertEquals(ReadableType.Number, map.getType("second"));
assertUnexpectedTypeExceptionThrown(map, "second", "int");
}
static private OAuthRequest addParametersToRequest(
OAuthRequest request,
final String access_token,
@Nullable final ReadableMap params
) {
if (params != null && params.hasKey("params")) {
ReadableMapKeySetIterator iterator = params.keySetIterator();
while (iterator.hasNextKey()) {
String key = iterator.nextKey();
ReadableType readableType = params.getType(key);
switch(readableType) {
case String:
String val = params.getString(key);
// String escapedVal = Uri.encode(val);
if (val.equals("access_token")) {
val = access_token;
}
request.addParameter(key, val);
break;
default:
throw new IllegalArgumentException("Could not read object with key: " + key);
}
}
}
return request;
}
public static HashMap<String, Object> readableMapToHashMap(ReadableMap readableMap) {
if (readableMap == null) {
return null;
}
HashMap map = new HashMap<String, Object>();
ReadableMapKeySetIterator keySetIterator = readableMap.keySetIterator();
while (keySetIterator.hasNextKey()) {
String key = keySetIterator.nextKey();
ReadableType type = readableMap.getType(key);
switch(type) {
case String:
map.put(key, readableMap.getString(key));
break;
case Map:
HashMap<String, Object> attributes = new RCTConvert().readableMapToHashMap(readableMap.getMap(key));
map.put(key, attributes);
break;
default:
// do nothing
}
}
return map;
}
public void exec(final String sql, final ReadableArray values) {
SQLiteStatement statement = Assertions.assertNotNull(db).compileStatement(sql);
db.beginTransaction();
try {
for (int i=0; i < values.size(); i++) {
if (values.getType(i) == ReadableType.Number) {
statement.bindLong(i+1, values.getInt(i));
} else {
statement.bindString(i+1, values.getString(i));
}
}
statement.execute();
db.setTransactionSuccessful();
} catch (Exception e) {
throw e;
} finally {
db.endTransaction();
}
}
private void bindArgsToStatement(SQLiteStatement myStatement, ReadableArray sqlArgs) {
for (int i = 0; i < sqlArgs.size(); i++) {
ReadableType type = sqlArgs.getType(i);
if (type == ReadableType.Number){
double tmp = sqlArgs.getDouble(i);
if (tmp == (long) tmp) {
myStatement.bindLong(i + 1, (long) tmp);
} else {
myStatement.bindDouble(i + 1, tmp);
}
} else if (sqlArgs.isNull(i)) {
myStatement.bindNull(i + 1);
} else {
myStatement.bindString(i + 1, SQLitePluginConverter.getString(sqlArgs,i,""));
}
}
}
@Override
void dataSetConfig(IDataSet<BarEntry> dataSet, ReadableMap config) {
BarDataSet barDataSet = (BarDataSet) dataSet;
ChartDataSetConfigUtils.commonConfig(barDataSet, config);
ChartDataSetConfigUtils.commonBarLineScatterCandleBubbleConfig(barDataSet, config);
if (BridgeUtils.validate(config, ReadableType.Number, "barSpacePercent")) {
barDataSet.setBarSpacePercent((float) config.getDouble("barSpacePercent"));
}
if (BridgeUtils.validate(config, ReadableType.String, "barShadowColor")) {
barDataSet.setBarShadowColor(Color.parseColor(config.getString("barShadowColor")));
}
if (BridgeUtils.validate(config, ReadableType.Number, "highlightAlpha")) {
barDataSet.setHighLightAlpha(config.getInt("highlightAlpha"));
}
if (BridgeUtils.validate(config, ReadableType.Array, "stackLabels")) {
barDataSet.setStackLabels(BridgeUtils.convertToStringArray(config.getArray("stackLabels")));
}
}
@Override
CandleEntry createEntry(ReadableArray yValues, int index) {
if (!ReadableType.Map.equals(yValues.getType(index))) {
throw new IllegalArgumentException();
}
ReadableMap entryData = yValues.getMap(index);
if (!BridgeUtils.validate(entryData, ReadableType.Number, "shadowH") ||
!BridgeUtils.validate(entryData, ReadableType.Number, "shadowL") ||
!BridgeUtils.validate(entryData, ReadableType.Number, "open") ||
!BridgeUtils.validate(entryData, ReadableType.Number, "close")) {
throw new IllegalArgumentException("CandleStick data must contain: shadowH, shadowL, open and close values");
}
float shadowH = (float) entryData.getDouble("shadowH");
float shadowL = (float) entryData.getDouble("shadowL");
float open = (float) entryData.getDouble("open");
float close = (float) entryData.getDouble("close");
return new CandleEntry(index, shadowH, shadowL, open, close);
}
@ReactProp(name = "description")
public void setDescription(Chart chart, ReadableMap propMap) {
if (BridgeUtils.validate(propMap, ReadableType.String, "text")) {
chart.setDescription(propMap.getString("text"));
}
if (BridgeUtils.validate(propMap, ReadableType.String, "textColor")) {
chart.setDescriptionColor(Color.parseColor(propMap.getString("textColor")));
}
if (BridgeUtils.validate(propMap, ReadableType.Number, "textSize")) {
chart.setDescriptionTextSize((float) propMap.getDouble("textSize"));
}
if (BridgeUtils.validate(propMap, ReadableType.Number, "positionX") &&
BridgeUtils.validate(propMap, ReadableType.Number, "positionY")) {
chart.setDescriptionPosition((float) propMap.getDouble("positionX"), (float) propMap.getDouble("positionY"));
}
if (BridgeUtils.validate(propMap, ReadableType.String, "fontFamily") ||
BridgeUtils.validate(propMap, ReadableType.Number, "fontStyle")) {
chart.setDescriptionTypeface(BridgeUtils.parseTypeface(chart.getContext(), propMap, "fontStyle", "fontFamily"));
}
}
@ReactProp(name = "zoom")
public void setZoom(BarLineChartBase chart, ReadableMap propMap) {
if (BridgeUtils.validate(propMap, ReadableType.Number, "scaleX") &&
BridgeUtils.validate(propMap, ReadableType.Number, "scaleY") &&
BridgeUtils.validate(propMap, ReadableType.Number, "xValue") &&
BridgeUtils.validate(propMap, ReadableType.Number, "yValue")) {
YAxis.AxisDependency axisDependency = YAxis.AxisDependency.LEFT;
if (propMap.hasKey("axisDependency") &&
propMap.getString("axisDependency").equalsIgnoreCase("RIGHT")) {
axisDependency = YAxis.AxisDependency.RIGHT;
}
chart.zoom(
(float) propMap.getDouble("scaleX"),
(float) propMap.getDouble("scaleY"),
(float) propMap.getDouble("xValue"),
(float) propMap.getDouble("yValue"),
axisDependency
);
}
}
@ReactProp(name = "drawerPosition")
public void setDrawerPosition(ReactDrawerLayout view, Dynamic drawerPosition) {
if (drawerPosition.isNull()) {
view.setDrawerPosition(Gravity.START);
} else if (drawerPosition.getType() == ReadableType.Number) {
final int drawerPositionNum = drawerPosition.asInt();
if (Gravity.START == drawerPositionNum || Gravity.END == drawerPositionNum) {
view.setDrawerPosition(drawerPositionNum);
} else {
throw new JSApplicationIllegalArgumentException("Unknown drawerPosition " + drawerPositionNum);
}
} else if (drawerPosition.getType() == ReadableType.String) {
final String drawerPositionStr = drawerPosition.asString();
if (drawerPositionStr.equals("left")) {
view.setDrawerPosition(Gravity.START);
} else if (drawerPositionStr.equals("right")) {
view.setDrawerPosition(Gravity.END);
} else {
throw new JSApplicationIllegalArgumentException("drawerPosition must be 'left' or 'right', received" + drawerPositionStr);
}
} else {
throw new JSApplicationIllegalArgumentException("drawerPosition must be a string or int");
}
}
public static void commonLineRadarConfig(LineRadarDataSet dataSet, ReadableMap config) {
if (BridgeUtils.validate(config, ReadableType.String, "fillColor")) {
dataSet.setFillColor(Color.parseColor(config.getString("fillColor")));
}
if (BridgeUtils.validate(config, ReadableType.Number, "fillAlpha")) {
dataSet.setFillAlpha(config.getInt("fillAlpha"));
}
// TODO setFillDrawable android.graphics.drawable.Drawable
if (BridgeUtils.validate(config, ReadableType.Boolean, "drawFilled")) {
dataSet.setDrawFilled(config.getBoolean("drawFilled"));
}
if (BridgeUtils.validate(config, ReadableType.Number, "lineWidth")) {
float lineWidth = (float) config.getDouble("lineWidth");
if (lineWidth >= 0.2f && lineWidth < 10f) {
dataSet.setLineWidth(lineWidth);
}
}
}
private static List<String> toList(final ReadableArray readableArray) {
if ((readableArray == null) || (readableArray.size() == 0)) {
return null;
}
List<String> result = new ArrayList<>();
for (int i = 0; i < readableArray.size(); i++) {
if (readableArray.getType(i) == ReadableType.String) {
result.add(readableArray.getString(i));
}
}
return result;
}
/**
* toObject extracts a value from a {@link ReadableMap} by its key,
* and returns a POJO representing that object.
*
* @param readableMap The Map to containing the value to be converted
* @param key The key for the value to be converted
* @return The converted POJO
*/
public static Object toObject(@Nullable ReadableMap readableMap, String key) {
if (readableMap == null) {
return null;
}
Object result;
ReadableType readableType = readableMap.getType(key);
switch (readableType) {
case Null:
result = null;
break;
case Boolean:
result = readableMap.getBoolean(key);
break;
case Number:
// Can be int or double.
double tmp = readableMap.getDouble(key);
if (tmp == (int) tmp) {
result = (int) tmp;
} else {
result = tmp;
}
break;
case String:
result = readableMap.getString(key);
break;
case Map:
result = toMap(readableMap.getMap(key));
break;
case Array:
result = toList(readableMap.getArray(key));
break;
default:
throw new IllegalArgumentException("Could not convert object with key: " + key + ".");
}
return result;
}
public static JSONArray reactToJSON(ReadableArray readableArray) throws JSONException {
JSONArray jsonArray = new JSONArray();
for(int i=0; i < readableArray.size(); i++) {
ReadableType valueType = readableArray.getType(i);
switch (valueType){
case Null:
jsonArray.put(JSONObject.NULL);
break;
case Boolean:
jsonArray.put(readableArray.getBoolean(i));
break;
case Number:
try {
jsonArray.put(readableArray.getInt(i));
} catch(Exception e) {
jsonArray.put(readableArray.getDouble(i));
}
break;
case String:
jsonArray.put(readableArray.getString(i));
break;
case Map:
jsonArray.put(reactToJSON(readableArray.getMap(i)));
break;
case Array:
jsonArray.put(reactToJSON(readableArray.getArray(i)));
break;
}
}
return jsonArray;
}
static Object get(ReadableArray array,int index,Object defaultValue){
if (array == null){
return defaultValue;
}
try {
Object value = null;
ReadableType type = array.getType(index);
switch(type){
case Boolean:
value = array.getBoolean(index);
break;
case Number:
value = array.getDouble(index);
break;
case String:
value = array.getString(index);
break;
case Map:
value = array.getMap(index);
break;
case Array:
value = array.getArray(index);
break;
case Null:
break;
}
return value;
} catch (NoSuchKeyException ex){
return defaultValue;
}
}
/**
* Besides width/height, all other layout props on inline images are ignored
*/
@Override
public void setWidth(Dynamic width) {
if (width.getType() == ReadableType.Number) {
mWidth = (float) width.asDouble();
} else {
throw new JSApplicationIllegalArgumentException(
"Inline images must not have percentage based width");
}
}
/**
* Returns the value at {@code index} if it exists, coercing it if
* necessary.
*/
static String getString(ReadableArray array, int index, String defaultValue) {
if (array == null){
return defaultValue;
}
try {
ReadableType type = array.getType(index);
switch (type) {
case Number:
double value = array.getDouble(index);
if (value == (long) value) {
return String.valueOf((long) value);
} else {
return String.valueOf(value);
}
case Boolean:
return String.valueOf(array.getBoolean(index));
case String:
return array.getString(index);
case Null:
return null;
default:
return defaultValue;
}
} catch(NoSuchKeyException ex){
return defaultValue;
}
}
public static Map<String, Object> toMap(ReadableMap readableMap) {
Map<String, Object> map = new HashMap<>();
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
while (iterator.hasNextKey()) {
String key = iterator.nextKey();
ReadableType type = readableMap.getType(key);
switch (type) {
case Null:
map.put(key, null);
break;
case Boolean:
map.put(key, readableMap.getBoolean(key));
break;
case Number:
map.put(key, readableMap.getDouble(key));
break;
case String:
map.put(key, readableMap.getString(key));
break;
case Map:
map.put(key, MapUtil.toMap(readableMap.getMap(key)));
break;
case Array:
map.put(key, ArrayUtil.toArray(readableMap.getArray(key)));
break;
}
}
return map;
}
public static float getSpringDamping(ReadableMap params){
if (params.getType(PARAM_SPRING_DAMPING).equals(ReadableType.Number)){
return (float) params.getDouble(PARAM_SPRING_DAMPING);
} else {
return FACTOR;
}
}
private static String stackFrameToModuleId(ReadableMap frame) {
if (frame.hasKey("file") &&
!frame.isNull("file") &&
frame.getType("file") == ReadableType.String) {
final Matcher matcher = mJsModuleIdPattern.matcher(frame.getString("file"));
if (matcher.find()) {
return matcher.group(1) + ":";
}
}
return "";
}
public static Object[] toArray(ReadableArray readableArray) {
Object[] array = new Object[readableArray.size()];
for (int i = 0; i < readableArray.size(); i++) {
ReadableType type = readableArray.getType(i);
switch (type) {
case Null:
array[i] = null;
break;
case Boolean:
array[i] = readableArray.getBoolean(i);
break;
case Number:
array[i] = readableArray.getDouble(i);
break;
case String:
array[i] = readableArray.getString(i);
break;
case Map:
array[i] = MapUtil.toMap(readableArray.getMap(i));
break;
case Array:
array[i] = ArrayUtil.toArray(readableArray.getArray(i));
break;
}
}
return array;
}
/**
* Returns the value at {@code index} if it exists, coercing it if
* necessary.
*/
static String getString(ReadableArray array, int index, String defaultValue) {
if (array == null){
return defaultValue;
}
try {
ReadableType type = array.getType(index);
switch (type) {
case Number:
double value = array.getDouble(index);
if (value == (long) value) {
return String.valueOf((long) value);
} else {
return String.valueOf(value);
}
case Boolean:
return String.valueOf(array.getBoolean(index));
case String:
return array.getString(index);
case Null:
return null;
default:
return defaultValue;
}
} catch(NoSuchKeyException ex){
return defaultValue;
}
}
/**
* Attempts to pull the ReadableMap's attribute out as the proper type
*
* @param readableMap The Facebook ReadableMap to parse
* @param key The map key to attempt to read from the readableMap
* @return the converted attribute from the map if available
*/
public static Object toObject(@Nullable ReadableMap readableMap, String key) {
if (readableMap == null) {
return null;
}
Object result;
ReadableType readableType = readableMap.getType(key);
switch (readableType) {
case Null:
result = null;
break;
case Boolean:
result = readableMap.getBoolean(key);
break;
case Number:
// Can be int or double.
double tmp = readableMap.getDouble(key);
if (tmp == (int) tmp) {
result = (int) tmp;
} else {
result = tmp;
}
break;
case String:
result = readableMap.getString(key);
break;
case Map:
result = toMap(readableMap.getMap(key));
break;
case Array:
result = toList(readableMap.getArray(key));
break;
default:
throw new IllegalArgumentException("Could not convert object with key: " + key + ".");
}
return result;
}
public static ArrayList<String> parseReadableArrayOfStrings(ReadableArray readableArray) {
ArrayList<String> array = new ArrayList<>();
for (int i = 0; i < readableArray.size(); i++) {
ReadableType type = readableArray.getType(i);
if (type == ReadableType.String) {
array.add(readableArray.getString(i));
}
}
return array;
}
/**
* toObject extracts a value from a {@link ReadableMap} by its key,
* and returns a POJO representing that object.
*
* @param readableMap The Map to containing the value to be converted
* @param key The key for the value to be converted
* @return The converted POJO
*/
public static Object toObject(@Nullable ReadableMap readableMap, String key) {
if (readableMap == null) {
return null;
}
Object result;
ReadableType readableType = readableMap.getType(key);
switch (readableType) {
case Null:
result = key;
break;
case Boolean:
result = readableMap.getBoolean(key);
break;
case Number:
// Can be int or double.
double tmp = readableMap.getDouble(key);
if (tmp == (int) tmp) {
result = (int) tmp;
} else {
result = tmp;
}
break;
case String:
result = readableMap.getString(key);
break;
case Map:
result = toMap(readableMap.getMap(key));
break;
case Array:
result = toList(readableMap.getArray(key));
break;
default:
throw new IllegalArgumentException("Could not convert object with key: " + key + ".");
}
return result;
}
private void addAttachments(Intent intent, ReadableArray attachments) {
if (attachments == null) return;
ArrayList<Uri> uris = new ArrayList<>();
for (int i = 0; i < attachments.size(); i++) {
if (attachments.getType(i) == ReadableType.Map) {
ReadableMap attachment = attachments.getMap(i);
if (attachment != null) {
byte[] blob = getBlob(attachment, "data");
String text = getString(attachment, "text");
// String mimeType = getString(attachment, "mimeType");
String filename = getString(attachment, "filename");
if (filename == null) {
filename = UUID.randomUUID().toString();
}
String ext = getString(attachment, "ext");
File tempFile = createTempFile(filename, ext);
if (blob != null) {
tempFile = writeBlob(tempFile, blob);
} else if (text != null) {
tempFile = writeText(tempFile, text);
}
if (tempFile != null) {
uris.add(Uri.fromFile(tempFile));
}
}
}
}
if (uris.size() > 0) {
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
}
}
private byte[] getBlob(ReadableMap map, String key) {
if (map.hasKey(key) && map.getType(key) == ReadableType.String) {
String base64 = map.getString(key);
if (base64 != null && !base64.isEmpty()) {
return Base64.decode(base64, 0);
}
}
return null;
}