从android本机传递连续回调以响应本机组件

时间:2016-10-18 16:15:10

标签: react-native-android

我正在为具有Android操作系统的设备开发条形码扫描仪应用程序。在该设备中,motorola提供用于扫描条形码和获取数据的SDK。我已经编写了一个反应原生应用程序,用于呈现我的UI和本机安卓以获取条形码。现在我想要做的事情就像每次当本机android获取扫描数据作为来自motorola sdk的回调它应该将它传递给rect native.I尝试回调方法但回调只能被本机模块调用一次,这对我不起作用因为项目将被多次扫描。

3 个答案:

答案 0 :(得分:5)

不幸的是,这是isn't covered too well in the official docs。 我想将此方法添加到我的所有桥接模块

private void sendEvent(String eventName, @Nullable WritableMap params) {
        getReactApplicationContext()
               .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
               .emit(eventName, params);
    }

Params可以有许多不同的类型。这是他们如何从Java映射到JS

Boolean -> Bool
Integer -> Number
Double -> Number
Float -> Number
String -> String
Callback -> function
WritableMap -> Object
WritableArray -> Array

如果要从本机代码向React Native发出和事件,请使用此函数。如果要将Array或Object作为参数传递,则必须事先构建WritableMap或WritableArray

示例:

public void emitInfo() {
   infoMap = Arguments.createMap();
   infoMap.putString("name", "dooley-doo");
   infoMap.putInt("version", 16);
   infoMap.putBoolean("isTrustworthy", False);
   sendEvent('INFO_EVENT', infoMap);
}

然后在JS中,您可以像这样订阅此事件:

const eventEmitter = new NativeEventEmitter(NativeModules.myModule);
this.subscription = eventEmitter.addListener('INFO_EVENT',(params)=>console.log(params));          

然后当你完成后,取消订阅如下:this.subscription.remove();

答案 1 :(得分:4)

在index.android.js文件中添加这些行

&myArray[middle]

并且在android中从哪里想要从android native发送数据以反应原生JS调用此

    import {NativeEventEmitter } from 'react-native';

   class ReactNativeExample extends Component {
       constructor(props) {
           super(props);
           this.subscription = null;
          ....
       }

        componentDidMount() {
        const EVENT_NAME = new NativeEventEmitter(NativeModules.ChatMessageManager);
        this.subscription = EVENT_NAME.addListener(
                                 'EVENT_TAG',
                                 (message) => {
                                //Your logic
                                 });
    }

    componentWillUnmount() {
        this.subscription.remove();
    }

}

答案 2 :(得分:0)

上面提到的答案很有帮助。就我而言,我在MainActivity.java中将reactContext定义为

ReactInstanceManager mReactInstanceManager = getReactNativeHost().getReactInstanceManager();
        ReactApplicationContext reactContext = (ReactApplicationContext) mReactInstanceManager.getCurrentReactContext();

并通过

private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }

希望有帮助。