简体   繁体   中英

React native not calling Android native method from parent app

I am trying to get my react native redis module up and running, but getting following error. when i try to refer to any function

 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; 

File that has actual redis calls via redison jar RedisClient.java

 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; } } 

Exposing the methods to java script 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(); } } 

does this _reactNativeRedispubsub.RedisClient.redisConnect means its not getting to right object to call ?

I am confused as to why its not picking up the redisConnect which is there in the RedisClient.java

this entire code is working in my react-native android project where i have MainActivity running, but dosent work when i publish it to npm and get it my npm install

I got it

following change needs to be done in redisclient.js

/** * This exposes our Android code into our RN project */

import { NativeModules } from "react-native";

const { RedisClient } = NativeModules;

export {
  RedisClient
}

I use something like this:

import {NativeModules} from 'react-native';
module.exports = NativeModules.RedisClient;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM