Как мне вернуть массив из модуля Java в React Native Component?

Я пишу это, чтобы ответить на мой собственный вопрос, потому что в документах это явно не указано, и я не смог найти его при переполнении стека или где-либо еще. Вот как вернуть массив String из модуля Java обратно в собственный компонент React (упрощенно из кода в моем личном проекте).

Файл CPPConnection.java

public class CPPConnection extends ReactContextBaseJavaModule {
@ReactMethod
    public void GetDerivedUnits(String scheme,final Promise promise){
        try {

            List<String> returnSet = new ArrayList<String>();
            //Set first value so that there is a lead value
            returnSet.add("");
            returnSet.add(scheme);
            returnSet.add("lb");
            returnSet.add("kg");
            String[] returnArray = new String[returnSet.size()];
            returnArray = returnSet.toArray(returnArray);

            WritableArray promiseArray=Arguments.createArray();
            for(int i=0;i<returnArray.length;i++){
                promiseArray.pushString(returnArray[i]);
            }

            promise.resolve(promiseArray);
        }
        catch(Exception e){
            promise.reject(e);
        }
    }
}

Файл Density.js

export default class Density extends Component{
...
constructor(props) {
    super(props);
    this.state = {
      mass: '',
      massUnits:[],
      volume: '',
      volumeUnits:[],
      density: 'N/A',
    };
    this.GetDerivedUnits("M",this.state.massUnits);
    this.GetDerivedUnits("L3",this.state.volumeUnits);
}

GetDerivedUnits= async (scheme,unitArray)=>{
    try{

        let asyncUnitSet = await CPPConnection.GetDerivedUnits(scheme);


        for (let i=0;i<asyncUnitSet.length;i++){
            unitArray.push(asyncUnitSet[i])
            this.setState({
                        unitArray: unitArray
                    })

        }

        console.log(asyncUnitSet);
    }catch(e){
        console.error(e);
    }
}
...
}

2 ответа

Решение

Я пишу это, чтобы ответить на мой собственный вопрос, потому что в документах это явно не указано, и я не смог найти его при переполнении стека или где-либо еще. Вот как вернуть массив String из модуля Java обратно в собственный компонент React (упрощенно из кода в моем личном проекте).

Файл CPPConnection.java

public class CPPConnection extends ReactContextBaseJavaModule {
@ReactMethod
    public void GetDerivedUnits(String scheme,final Promise promise){
        try {

            List<String> returnSet = new ArrayList<String>();
            //Set first value so that there is a lead value
            returnSet.add("");
            returnSet.add(scheme);
            returnSet.add("lb");
            returnSet.add("kg");
            String[] returnArray = new String[returnSet.size()];
            returnArray = returnSet.toArray(returnArray);

            WritableArray promiseArray=Arguments.createArray();
            for(int i=0;i<returnArray.length;i++){
                promiseArray.pushString(returnArray[i]);
            }

            promise.resolve(promiseArray);
        }
        catch(Exception e){
            promise.reject(e);
        }
    }
}

Файл Density.js

export default class Density extends Component{
...
constructor(props) {
    super(props);
    this.state = {
      mass: '',
      massUnits:[],
      volume: '',
      volumeUnits:[],
      density: 'N/A',
    };
    this.GetDerivedUnits("M",this.state.massUnits);
    this.GetDerivedUnits("L3",this.state.volumeUnits);
}

GetDerivedUnits= async (scheme,unitArray)=>{
    try{

        let asyncUnitSet = await CPPConnection.GetDerivedUnits(scheme);


        for (let i=0;i<asyncUnitSet.length;i++){
            unitArray.push(asyncUnitSet[i])
            this.setState({
                        unitArray: unitArray
                    })

        }

        console.log(asyncUnitSet);
    }catch(e){
        console.error(e);
    }
}
...
}

Вы можете использовать ReadableArray, как описано здесь.

Другие вопросы по тегам