我如何将HashMap传递给react-native android回调?

问题描述 投票:0回答:2

当尝试在自定义本机模块中提供回调时,

java.util.HashMap
,我收到以下错误:
java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap

我不太清楚什么类型可以传递给回调。有人建议使用

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());
        }
    });
}
android react-native
2个回答
9
投票

对于键值结构,回调需要一个

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

0
投票

注意:在最近的React Native版本中,从

HashMap
到React Native Map的转换很容易:

  • WritableMap
    继承自
    HashMap<String, Object>
    并实现
    Map<String, Object>
    。所以没什么可做的。
  • ReadableMap
    有一个构造函数
    ReadableMap(Map<String, Object> map)
    。因此,您可以通过执行
    ReadableMap
     创建一个 
    new ReadableMap(myMap)
© www.soinside.com 2019 - 2024. All rights reserved.