gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:35:01 26 4
gpt4 key购买 nike

我想在我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com