Как я могу передать HashMap ответному обратному обращению с помощью Android?

При попытке дать обратный вызов в настраиваемом собственном модуле java.util.HashMap , я получаю следующую ошибку: java.lang.RuntimeException: Cannot convert argument of type class java.util.HashMap .

Я не очень понимаю, какие типы могут быть переданы для обратного вызова. Кто-то предлагает использовать SO с помощью 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()); } }); } 

Для структур с ключевыми значениями обратный вызов ожидает WritableMap , что означает, что любая структура данных, которую вы используете, должна быть преобразована в WritableMap .

Вот базовая реализация DataSnapshot от 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; } } }