javascript - Android int 值的 React-Native 模块返回晚了吗?

标签 javascript java android react-native

我有一个原生 Android 应用程序,现在它有一个 React-Native 部分。

简而言之,我在原生 Android/Java 中有一个 ListView 。当我点击一行时,我会启动一个新的 Activity,它会导致 React-Native 代码。

组件进行 API 调用,但在调用之前,我的代码通过 React Native 模块从 header 的 Java/Android 设置中的用户首选项中获取值,以便它可以进行正确的 API 调用.

/actions/index.js 中的 React Native API 调用:

export const toggleBlocked = (user_id) =>
async dispatch => {
  try {
    let headers = await getHeaders();
    const response = await fetch('http://my.domain.com/api/get_data?user_id=`${user_id}`', { headers, method: 'GET' });
    if (response.status == 200) {
      // do stuff
    } else {            
      ToastAndroid.show("Looks like the response wasnt good :(", ToastAndroid.LONG, ToastAndroid.CENTER);
    }
  } catch (error) {
    ToastAndroid.show("An Error Occurred :(", ToastAndroid.LONG, ToastAndroid.CENTER);
  }
};


function getHeaders() {
  let userId = UserService.getUserId()
  console.log("2. React-Native | getHeaders... user_id is " + userId)
  return (
    new Headers({
      Cookie: `abcxyz=${userId}`,
      user_id: userId,
      "User-Agent": "android",
      "Content-Type": "application/json",
      charset: "utf-8",
      "app-version": "9.1.23",
      Accept: "application/json"
    })
  )
}

回到原生 Android/Java,我已经设置了我的模块和包。这是 UserServiceModule.java:

    @ReactMethod
    public int getUserId() {
        SharedPreferences settings = mContext.getSharedPreferences(Constants.SettingsPreference, Context.MODE_PRIVATE);
        int userId = settings.getUserId();
        Log.d(TAG, "1. Java/Android code. UserID is " + userId);
        return userId;
    }

当我运行代码时,user_id 始终为空。我什至希望我的日志按顺序显示(请参阅编号的日志),但它们是相反的??

"1. Java/Android code. UserID is 123"
"2. React-Native | getHeaders... user_id is 123"

请提供任何见解。谢谢。

更新/解决方案 这是使事情正常工作的更新更改:

@ReactMethod
public void getUserId(final Promise promise) {
    SharedPreferences settings = mContext.getSharedPreferences(Constants.SettingsPreference, Context.MODE_PRIVATE);
    int userId = settings.getUserId();
    Log.d(TAG, "1. Java/Android code. UserID is " + userId);

    promise.resolve(Integer.toString(userId));
}

最佳答案

@ReactMethod 函数总是假设返回 void 并且是异步的。你得到 null 的原因是因为你的 JS 代码是同步编写的。它将变量 userId 初始化为 null 并将其设置为异步调用的返回值。但是因为您编写的代码是同步的,所以它会在 react 方法返回值之前转到下一行。

您需要像使用调度方法一样执行异步等待。然而,这还不够,因为 React 方法会返回一个 void 值。坦率地说,我不知道如何不触发未找到方法错误。也许@ReactMethod 会忽略你在 Java 中定义的返回值?

无论如何,在设置异步等待之后。做一些类似于他们在这里所做的事情: https://facebook.github.io/react-native/docs/native-modules-android.html#callbacks

关于javascript - Android int 值的 React-Native 模块返回晚了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43876757/

相关文章:

javascript - 在node.js中使用加密的aes-128-cbc加密/解密没有给出与java代码相同的结果

javascript - 如何动态创建数组元素并将值(从具有相同名称的变量)分配给元素

javascript - 输入类型 radio 在 iPhone 上不工作

javascript - 切换点击替代

java - 使用 Spring 的 REST Api 实现

java - Kafka命令行consumer读取,但无法通过Java读取

java - 缩放 ImageView 的最佳方式

android - 为什么我的 ListView/Dialog 不透明?

android - 多个 ListFragment 的 fragment 管理最佳实践

java - 多线程访问数组