javascript - 反应原生不从父应用调用Android原生方法
问题描述
我正在尝试让我的 react 本机 redis 模块启动并运行,但出现以下错误。当我尝试引用任何函数时
TypeError: undefined is not an object (evaluating '_reactNativeRedispubsub.RedisClient.redisConnect')
RedisClient.js
/**
* This exposes our Android code into our RN project
*/
import { NativeModules } from "react-native";
module.exports = NativeModules.RedisClient;
通过 redison jar RedisClient.java 具有实际 redis 调用的文件
package com.redispubsub;
import android.util.Log;
import android.widget.Toast;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.redisson.Redisson;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.redisson.client.RedisConnectionException;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
public class RedisClient extends ReactContextBaseJavaModule {
private final ReactApplicationContext reactContext;
private RedissonClient mredissonClient;
public RedisClient(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}
@Override
public String getName() {
return "RedisClient";
}
@ReactMethod
public void redisConnect(String ipPort) {
//Redisson client setup to be done in background thread
try {
Config config = new Config();
config.useSingleServer().setAddress(ipPort); //IPAddress of Redis and port
mredissonClient = Redisson.create(config);
} catch (Exception ex) {
ex.printStackTrace();
}
}
@ReactMethod
public void subscribe(String channelName) {
if (mredissonClient != null) {
RTopic subscribeTopic = mredissonClient.getTopic(channelName, StringCodec.INSTANCE); //Channel to listen and Codec.
subscribeTopic.addListener(new MessageListener < String > () {
@Override
public void onMessage(String channel, String msg) {
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(channel, msg);
}
});
} else {
}
}
@ReactMethod
public long publish(String ChannelName, String msg) {
long clientsReceivedMessage = 0;
if (mredissonClient != null) {
//Redisson publish
RTopic topic = mredissonClient.getTopic(ChannelName, StringCodec.INSTANCE);
try {
clientsReceivedMessage = topic.publish(msg); //Publishing lat lon to Coros
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
}
return clientsReceivedMessage;
}
}
将方法暴露给 java 脚本 RedisCleintPackage.java
package com.redispubsub;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
public class RedisClientPackage implements ReactPackage {
@Override
public List < NativeModule > createNativeModules(ReactApplicationContext reactContext) {
List < NativeModule > modules = new ArrayList < > ();
modules.add(new RedisClient(reactContext));
return modules;
}
public List < Class << ? extends JavaScriptModule >> createJSModules() {
return Arrays.asList();
}
@Override
public List < ViewManager > createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
这个 _reactNativeRedispubsub.RedisClient.redisConnect 是否意味着它没有找到正确的对象来调用?
我很困惑为什么它没有拿起 RedisClient.java 中的 redisConnect
整个代码在我运行 MainActivity 的 react-native android 项目中运行,但是当我将它发布到 npm 并将其获取到我的 npm 安装时,它就起作用了
解决方案
我知道了
需要在 redisclient.js 中进行以下更改
/** * 这会将我们的 Android 代码暴露到我们的 RN 项目中 */
import { NativeModules } from "react-native";
const { RedisClient } = NativeModules;
export {
RedisClient
}
推荐阅读
- java - 如何限制在 MySQL 中删除的特定行
- typescript - 创建一个包含递归函数的承诺
- apache-spark - Spark - 如何在 DataFrame 中连接当前和以前的记录并将原始字段分配给所有此类事件
- function - db2 - CREATE FUNCTION 中的 CASE WHEN 或 IF 语句
- php - 如何从数据库中的数据中删除标签?
- c++ - 启动/运行外部可执行文件并查看其输出日志
- javascript - Grafana:尝试加载为 XMLHttpRequest 时响应失败
- php - Laravel Markdown 邮件与刀片模板
- php - laravel-er-diagram-generator - Graphviz
- docker - Gitlab-CI,Review Apps,GKE,好方法?