2
votes

passer une arraylist d'objets personnalisés pour réagir du côté natif d'Android

J'ai une liste d'objets personnalisés (List). Je dois envoyer ces données au côté React Native pour les afficher dans une liste plate. Comment faire? Cette liste est présente dans

classe NativeToReact (reactContext: ReactApplicationContext, userManager: IUserManager): ReactContextBaseJavaModule (reactContext) `


0 commentaires

3 Réponses :


0
votes

Vous devez mapper votre liste dans un objet JSON


0 commentaires

5
votes

Puisque vous souhaitez envoyer une ArrayList , vous devez envoyer un WritableArray du côté natif pour réagir natif.

import NativeToReact from "./NativeToReactModule";

...
...
...

NativeToReact.returnArrayOfObjects(array => {
  console.log(array, "The array you sent from the native side");
});

Du côté react-native, vous pouvez créer un module javascript pour votre module natif comme suit:

import { NativeModules } from "react-native";
module.exports = NativeModules.NativeToReactModule;

Vous pouvez alors accéder au code ArrayList > vous avez envoyé du côté natif.

public class NativeToReactModule extends ReactContextBaseJavaModule {

  public NativeToReactModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "NativeToReactModule";
  }

  private static WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONException {
    WritableMap map = new WritableNativeMap();

    Iterator<String> iterator = jsonObject.keys();
    while (iterator.hasNext()) {
      String key = iterator.next();
      Object value = jsonObject.get(key);
      if (value instanceof JSONObject) {
        map.putMap(key, convertJsonToMap((JSONObject) value));
      } else if (value instanceof Boolean) {
        map.putBoolean(key, (Boolean) value);
      } else if (value instanceof Integer) {
        map.putInt(key, (Integer) value);
      } else if (value instanceof Double) {
        map.putDouble(key, (Double) value);
      } else if (value instanceof String) {
        map.putString(key, (String) value);
      } else {
        map.putString(key, value.toString());
      }
    }
    return map;
  }

  @ReactMethod
  public void returnArrayOfObjects(Callback successCallback) throws JSONException {
    List<CustomObject> aList = new ArrayList<CustomObject>();
    Gson g = new Gson();

    aList.add(new CustomObject("Nameone", 1));
    aList.add(new CustomObject("nametwo", 132));

    WritableArray array = new WritableNativeArray();
    for (CustomObject co : aList) {
      JSONObject jo = new JSONObject(g.toJson(co));
      WritableMap wm = convertJsonToMap(jo);
      array.pushMap(wm);
    }

    successCallback.invoke(array);
  }
}

REMARQUE : La réponse ne montre pas une configuration complète pour utiliser un module natif. p>


0 commentaires

0
votes

En développant (ou en réduisant?) la réponse de 10101010 , vous devriez / pourriez utiliser les classes d'assistance de FB pour convertir des valeurs à la place.

import { NativeModules } from "react-native"

NativeModules.NativeToReactModule.getArray(array => console.log(array, "The array you sent from the native side"))

Ensuite, du côté JS, il suffit d'appeler:

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.myapp.SomeClass;

public class NativeToReactModule extends ReactContextBaseJavaModule {

  public NativeToReactModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "NativeToReactModule";
  }

  @ReactMethod
  public void getArray(Callback successCallback) {
    WritableArray array = Arguments.fromList(SomeClass.SomeStaticListValue);
    successCallback.invoke(array);
  }
}


0 commentaires