gpt4 book ai didi

android - 我如何将 HashMap 传递给 react 原生的 android 回调?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:31 40 4
gpt4 key购买 nike

当尝试在自定义 native 模块 java.util.HashMap 中提供回调时,出现以下错误:java.lang.RuntimeException: 无法转换类型类 java 的参数.util.HashMap.

我不是很清楚什么样的类型可以传递给回调。有人建议在 SO 上使用 WritableNativeMap。如果是这样,是否有一种直接的方法来转换 HashMap ?或者我必须遍历所有键/值对吗?

如果没有,文档会提到一个 ReadableMap。那会更好吗?

非常感谢您的帮助。

这里有一些代码,希望对您有帮助。该方法使用 Firebase Android SDK:

public void fetch(String path, final Callback callback) {
root.child(path).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
// snapshot.getValue() is a java.util.HashMap
callback.invoke(null, snapshot.getValue()); // This triggers the error
} else {
callback.invoke(null);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
callback.invoke(firebaseError.getMessage());
}
});
}

最佳答案

对于键值结构,回调需要一个 WritableMap,这意味着您使用的任何数据结构都需要转换为 WritableMap

这是 Firebase 的 DataSnapshot 的基本实现:

private <Any> Any castSnapshot(DataSnapshot snapshot) {
if (snapshot.hasChildren()) {
WritableMap data = Arguments.createMap();
for (DataSnapshot child : snapshot.getChildren()) {
Any castedChild = castSnapshot(child);
switch (castedChild.getClass().getName()) {
case "java.lang.Boolean":
data.putBoolean(child.getKey(), (Boolean) castedChild);
break;
case "java.lang.Integer":
data.putInt(child.getKey(), (Integer) castedChild);
break;
case "java.lang.Double":
data.putDouble(child.getKey(), (Double) castedChild);
break;
case "java.lang.String":
data.putString(child.getKey(), (String) castedChild);
break;
case "com.facebook.react.bridge.WritableNativeMap":
data.putMap(child.getKey(), (WritableMap) castedChild);
break;
}
}
return (Any) data;
} else {
String type = snapshot.getValue().getClass().getName();
switch (type) {
case "java.lang.Boolean":
return (Any)((Boolean) snapshot.getValue());
case "java.lang.Long":
// TODO check range errors
return (Any)((Integer)(((Long) snapshot.getValue()).intValue()));
case "java.lang.Double":
return (Any)((Double) snapshot.getValue());
case "java.lang.String":
return (Any)((String) snapshot.getValue());
default:
return (Any) null;
}
}
}

关于android - 我如何将 HashMap 传递给 react 原生的 android 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36289315/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com