2016-03-29 43 views
3

当试图在自定义本机模块a java.util.HashMap中给出回调时,出现以下错误:java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap如何将HashMap传递给反应原生的android回调?

我不是很清楚什么样的类型可以传递给回调。有人建议使用WritableNativeMap。如果是这样,是否有简单的方法来投射HashMap?或者我必须遍历所有键/值对?

如果不是,文档提及ReadableMap。这会更好吗?

非常感谢您的帮助。

这是一些代码,它有助于。该方法使用火力地堡的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()); 
     } 
    }); 
} 
+0

PLZ张贴代码....................... –

+0

@ExceptionLover DONE 。谢谢! – VonD

+0

优秀的问题和应该包含在React Native文档的本机模块页面上的问题。 –

回答

5

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

下面是从火力地堡的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; 
     } 
    } 
} 
相关问题