2016-03-29 6 views
3

Beim Versuch, einen Rückruf in einem benutzerdefinierten nativen Modul eine java.util.HashMap zu geben, erhalte ich den folgenden Fehler: java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap.Wie kann ich eine HashMap an einen reaktiven nativen Android Callback übergeben?

Ich bin nicht sehr klar, welche Art von Typen an den Rückruf übergeben werden kann. Jemand schlägt auf SO unter Verwendung WritableNativeMap vor. Wenn ja, gibt es eine direkte Möglichkeit, die HashMap zu werfen? Oder muss ich alle Schlüssel/Wert-Paare durchlaufen?

Wenn nicht, erwähnen die Dokumente eine ReadableMap. Wäre das besser?

Vielen Dank für Ihre Hilfe.

Hier ist ein Code, den es hilft. Das Verfahren nutzt die 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 dem Code ....................... –

+0

@ExceptionLover done . Vielen Dank! – VonD

+0

Ausgezeichnete Frage und eine, die auch auf der Seite Native Modules der React Native-Dokumentation enthalten sein sollte. –

Antwort

5

Für Schlüssel-Wert-Strukturen erwartet der Rückruf eine WritableMap, was bedeutet, was Datenstruktur Sie Bedürfnisse verwenden zu einem WritableMap umgewandelt werden.

Hier ist eine grundlegende Implementierung von DataSnapshot der Firebase:

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