HarmonyOS 鸿蒙Next EventHub如何用?感觉怎么用都不对。

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next EventHub如何用?感觉怎么用都不对。
<markdown _ngcontent-axe-c237="" class="markdownPreContainer">

@Preview
@Component
export default struct MainPage {
@State a: string = “10”

aboutToAppear() { // 注册广播事件,用的方法直接是调用onEventChanged getContext(this).eventHub.on(“event”, this.onEventChanged) }

aboutToDisappear() { // 注销广播事件 getContext(this).eventHub.off(“event”, this.onEventChanged) }

onEventChanged() { // ERROR 此处调用时,this非当前类,会崩溃。但如果改成使用匿名函数来注册,那如何注销? this.a = “20” this.executeFunction() }

executeFunction() { // do something }

build() { Button(“发送”).onClick(()=> { getContext(this).eventHub.emit(“event”) }) } } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

</markdown>

关于HarmonyOS 鸿蒙Next EventHub如何用?感觉怎么用都不对。的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

12 回复
改成:getContext(this).eventHub.on("event", this.onEventChanged.bind(this))

这个真可以

希望HarmonyOS能继续推出更多实用的功能,满足用户的不同需求。

在 UIAbility 可以直接绑函数,感觉UIAbility 中对象血缘关系清晰,妈就是亲生的。

let eventHub = this.context.eventHub;
eventHub.on('LoadService',this.LoadService);
eventHub.on('FirstAppear',this.FirstAppear);

在 Page中要换种方式,绑函数还要告诉它谁去调,感觉页面中对象都是流浪弃儿,都不知妈是谁。

let eventHub = getContext(this).eventHub;
eventHub.on('scrollIndex',this.onEventScrollIndex.bind(this));
eventHub.on('scrollEnd',this.onEventScrollEnd.bind(this));
直接把onEventChanged改成箭头函数就可以了

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

不考虑直接把context全局定义或者局部定义???每执行一个生命周期都要getContext(this)一次,怎么看怎么觉得怪,而且你这个引入方法也不对吧,虽然新版的会自动声明类型

现在是将响应方法写成一个变量。来解决这个问题。

[@Preview](/user/Preview)
[@Component](/user/Component)
export default struct MainPage {
  [@State](/user/State) a: string = "10"

abcdefg = () => { this.onEventChanged() } aboutToAppear() { // 注册广播事件,用的方法直接是调用onEventChanged getContext(this).eventHub.on(“event”, this.abcdefg) }

aboutToDisappear() { // 注销广播事件 getContext(this).eventHub.off(“event”, this.abcdefg) }

onEventChanged() { this.a = “20” this.executeFunction() }

executeFunction() { // do something }

build() { Button(“发送”).onClick(()=> { getContext(this).eventHub.emit(“event”) }) } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

这是this的用法问题

把下边的代码修改一下

修改前

getContext(this).eventHub.on("event", this.onEventChanged)<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

修改后

getContext(this).eventHub.on("event", ()=> {
this.onEventChanged()
})<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

如果这样写的话,那就没法注销广播了。

也使用相同的方法 getContext(this).eventHub.off(“event”, ()=> { this.onEventChanged() })进行注销广播好像就可以,这会出现什么问题吗?

这样子注销跟注册的是同一个匿名方法?怕是注销不掉吧。

回到顶部