简体   繁体   English

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

[英]How can i pass a HashMap to a react-native android callback?

When trying to give a callback in a custom native module a java.util.HashMap , I get the following error : java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap . 当尝试在自定义本机模块java.util.HashMap进行回调时,我收到以下错误: java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap

I am not very clear on what kind of types can be passed to the callback. 我不太清楚可以将哪种类型的类型传递给回调。 Someone suggests on SO using a WritableNativeMap . 有人建议在SO上使用WritableNativeMap If so, is there a straightforward way to cast the HashMap ? 如果是这样,是否有一种直接的方式来转换HashMap Or must I iterate through all key/value pairs ? 或者我必须遍历所有键/值对?

If not, the docs mention a ReadableMap . 如果没有,那么文档会提到一个ReadableMap Would that be better ? 会更好吗?

Many thanks for your help. 非常感谢您的帮助。

Here is some code it case it helps. 这是一些有用的代码。 The method uses the Firebase Android SDK: 该方法使用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());
        }
    });
}

For key-value structures, the callback expects a WritableMap , which means whatever data structure you're using needs to be converted to a WritableMap . 对于键值结构,回调需要一个WritableMap ,这意味着您使用的任何数据结构都需要转换为WritableMap

Here is a basic implementation from Firebase's DataSnapshot : 以下是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;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Android中的自定义本机UI组件react-native 0.21.0中,如何将属性从react-native传递给ViewManager中的setter方法? - In a custom native UI component in Android, react-native 0.21.0, how can I pass properties from react-native to the setter methods in a ViewManager? 我如何为反应原生的Android WebView设置AllowFileAccess? - How can I setAllowFileAccess for a react-native android WebView? 如何修复 React-Native Android affineFormats 错误 - How can I fix React-Native Android affineFormats error 我怎样才能在react-native android中找到ViewById() - How can I findViewById() in react-native android 如何将文本传递到 React-Native 中的组件? (安卓) - How to pass text into component in React-Native? (Android) 如何将数据从后台android服务传递到react-native - How to pass data from background android service to react-native 我可以在React-Native中使用material-components-android吗? - Can I use material-components-android with React-Native? 我如何修复 react-native run-android 首次运行错误 - how can i fix react-native run-android first run error 如何在 android 工作室中导入或打开 react-native 项目? - how can i import or open react-native project in android studio? 如何在 react-native 中添加 ios 或 android 平台特定的选择字段 - How can I add ios or android platform specific select field in react-native
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM