2016-03-29 11 views
3

カスタムネイティブモジュールでコールバックを実行しようとすると、java.util.HashMap、次のエラーが発生します。java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMapHashMapを反応ネイティブのアンドロイドコールバックに渡すにはどうすればよいですか?

コールバックにどのような種類の型を渡すことができるかはあまり明確ではありません。誰かが、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()); 
     } 
    }); 
} 
+0

plzのコードを投稿....................... –

+0

@ExceptionLoverを行います。ありがとう! – VonD

+0

React Nativeドキュメントのネイティブモジュールページにも優れた質問と1つの質問を含める必要があります。 –

答えて

5

、コールバックは、あなたが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; 
     } 
    } 
} 
関連する問題