javascript - React Native Android 原生 UI 组件中的自定义事件

标签 javascript java android react-native

我想在我的 Android 上的 React Native 应用程序中使用 OpenStreetMap 磁贴,所以我尝试按照 here. 的描述包装 OSMDroid 原生 UI 组件在大多数情况下它工作正常,但我无法弄清楚如何正确处理事件,特别是 onScrollonZoom

使用 OSMDroid,您可以设置一个 DelayedMapListener 来处理事件,这非常简单。我已经确认事件在 Java 端被正确处理,直到应该触发 JS 代码。但是,它们并没有触发我的 JavaScript 代码。

基于 the documentation ,我在 View 管理器的 createViewInstance 方法中用 Java 实现了事件处理程序:

map.setMapListener(new DelayedMapListener(new MapListener() {
    public boolean onScroll(ScrollEvent event) {
        WritableMap eventData = Arguments.createMap();

        // Fill in eventData; details not important

        ReactContext reactContext = (ReactContext)map.getContext();
        reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
            map.getId(),
            "topChange",
             eventData);

        return true;
    }

    public boolean onZoom(ZoomEvent event) {
        // Basically the same as above
    }
}, 100));

我的JS代码的相关部分与上面链接的文档中的代码基本相同:

class OSMDroidMapView extends Component {
    constructor(props) {
        super(props);
        this._onChange = this._onChange.bind(this);
    }

    _onChange(event: Event) {
        console.log(event);
        // Handle event data
    }

    render() {
        return <OSMDroidMapView {...this.props} onChange={this._onChange}/>
    }
}

没有错误或任何错误迹象。 Java 事件处理程序代码被正确调用。当事件发生时,JS 代码中没有任何迹象。有谁知道如何正确地做到这一点?我觉得我必须在这里遗漏一些基本概念。

最佳答案

要将自定义事件发送到 Javascript,您可以使用 RCTDeviceEventEmitter:

在 Native 端:

import com.facebook.react.modules.core.DeviceEventManagerModule;

...

public boolean onScroll(ScrollEvent event) {
    WritableMap eventData = Arguments.createMap();

    // Fill in eventData; details not important

    ReactContext reactContext = (ReactContext)map.getContext();
    reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("YouCustomEventName", eventData);

    return true;
}

在您的 JS 模块中,您只需使用 DeviceEventEmitter 注册一个监听器:

class OSMDroidMapView extends Component {
    constructor(props) {
        super(props);
        this._onChange = this._onChange.bind(this);
    }

    componentWillMount() {
        DeviceEventEmitter.addListener('YouCustomEventName', this._onChange);
    }

    componentWillUnmount() {
        DeviceEventEmitter.removeListener('YouCustomEventName', this._onChange);
    }

    _onChange(event: Event) {
        console.log(event);
        // Handle event data
    }

    render() {
        return <OSMDroidMapView {...this.props} onChange={this._onChange}/>
    }
}

希望对您有所帮助。

关于javascript - React Native Android 原生 UI 组件中的自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545598/

相关文章:

java - 如何 Swagger 注释具有复杂对象的 Spring GET @RequestMapping

java - 可以捕获 java.util.zip.ZipError 吗?

将服务绑定(bind)到 android.app.Activity 与将其绑定(bind)到 android.app.Application

java - 如何定义计数器不通过重新启动 Activity 重置?

javascript - 删除继承的 CSS 值?

javascript - HTML Canvas 和内存使用

javascript - 错误 : Objects are not valid as a React child (found: object with keys {$$typeof, 类型、比较、WrappedComponent、显示名称})

java - java.lang.reflect.Array 的 getter 和 setter 方法的目的是什么?

android - 如何获得轮廓的质心?安卓opencv

javascript - jQuery .focus() 在搜索字段的 Safari(桌面)中不起作用