Mat*_*han 7 javascript java android react-native
我有一个原生 Android 应用程序,现在它有一个 React-Native 部分。
简而言之,我在本机 Android/Java 中有一个列表视图。当我点击一行时,我启动一个新的 Activity,该 Activity 会导致 React-Native 代码。
这些组件进行 API 调用,但在调用之前,我的代码会通过 React Native 模块从标头的 Java/Android 设置中的用户首选项中获取值,以便它可以进行正确的 API 调用。
React Native API 调用/actions/index.js:
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"
})
)
}
Run Code Online (Sandbox Code Playgroud)
回到原生 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;
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,user_id 始终为空。我什至期望我的日志按顺序显示(参见编号日志),但它们是相反的?
"1. Java/Android code. UserID is 123"
"2. React-Native | getHeaders... user_id is 123"
Run Code Online (Sandbox Code Playgroud)
任何见解都会很棒。谢谢。
更新/解决方案 以下是使事情正常工作的更新更改:
@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));
}
Run Code Online (Sandbox Code Playgroud)
@ReactMethod 函数始终假定返回 void 并且是异步的。你得到 null 的原因是因为你的 JS 代码是同步编写的。它将变量 userId 初始化为 null 并使用异步调用的返回值设置它。但是因为您编写的代码是同步的,所以在反应方法返回值之前它将转到下一行。
您将需要像使用调度方法一样执行异步等待。然而,这还不够,因为反应方法返回一个空值。坦率地说,我不知道如何不触发方法未找到错误。也许@ReactMethod会忽略你在Java中定义的返回值?
无论如何,在设置异步等待之后。做一些类似于他们在这里所做的事情: https://facebook.github.io/react-native/docs/native-modules-android.html#callbacks
小智 5
isBlockingSynchronousMethod = true在@ReactMethod中设置
例子:
@ReactMethod(isBlockingSynchronousMethod = true)
public String getString(){
return "awesome string";
}
Run Code Online (Sandbox Code Playgroud)
在js文件中:
var someString = await NativeModule.ModuleName.getString();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6746 次 |
| 最近记录: |