Luo Ruidong
Luo Ruidong

Reputation: 91

React Native : Native modules return nothing

I'm new to React Native and I want to call native modules to get some strings from Android . I write the code like this:

@ReactMethod
public String getToken() {
    String token = "";
    //then take the token
    Log.i("getToken:", token);
    return token;
}

Then use in js.

var tokenString = thismodule.getToken();

However ,when i call the method in js. I can see the correct log " I/getToken : palapalapala " in logcat , but js can't get anything.

So , what's the correct code of this?

Upvotes: 4

Views: 3705

Answers (3)

Robin Dalmy
Robin Dalmy

Reputation: 380

ReactMethod are asynchronuous. So if you want to retrieve data from native to react native you would need to set up the method to return a promise.

See the docs here: https://reactnative.dev/docs/native-modules-android#promises

and in your js file you would need to await that promise or set up a then() function.

Callbacks also work like what Luo wrote.

Upvotes: 0

Akshay I
Akshay I

Reputation: 4175

According to react documentation

To expose a method to JavaScript a Java method must be annotated using @ReactMethod. The return type of bridge methods is always void. React Native bridge is asynchronous, so the only way to pass a result to JavaScript is by using callbacks or emitting events

@ReactMethod
public void getToken(Callback callback) {
    String token = "";
    //then take the token
    Log.i("getToken:", token);
    callback.invoke(token);
}

thismodule.getToken((token) => {
  console.log('Result ',token);
 }
);

Upvotes: 2

Luo Ruidong
Luo Ruidong

Reputation: 91

Oh,yes . I should know . The communicate between js and native is asynchronous . The js method who bridge to the native method , can't return anything now . So , we must sent a callback function to native and get the correct answer in the callback.

That's all.

Upvotes: 5

Related Questions