HarmonyOS鸿蒙Next中使用LiveEventBus接受消息后无法修改变量值

HarmonyOS鸿蒙Next中使用LiveEventBus接受消息后无法修改变量值 我使用下述三方库进行消息发送与接收,在PageB中,可以收到PageA发来的消息,但this.message并没有被修改。 项目Demo已传附件

3 回复

订阅消息您试一下以下方式: PageB.ets

import { LiveEventBus,Lifecycle,MState } from '[@ohos](/user/ohos)/liveeventbus';
import { router } from '[@kit](/user/kit).ArkUI';
[@Entry](/user/Entry)
[@Component](/user/Component)
struct PageB {
  [@State](/user/State) message: string = 'Hello World';
  [@StorageLink](/user/StorageLink)('aaa')  msg: string = '';
  observeFlag: boolean = false;
  mLifecycle: Lifecycle = new Lifecycle(MState.STARTED);
  aboutToAppear() {
    //创建生命周期感知对象
    this.mLifecycle = new Lifecycle(MState.STARTED)
    //订阅消息
    LiveEventBus
      .get<string>('aaa')
      .observe(this, {
        onChanged(s: string) {
        AppStorage.setOrCreate('aaa',s)
        }
      });
  }
  build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(()=> {
          router.back()
        })
      Text(this.msg)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(()=> {
          router.back()
        })
      Button('手动修改').onClick(() => {
        this.message = "手动修改"
      })
      Button('发送消息').onClick(() => {
        LiveEventBus.get<string>("aaa").post("lalala2222");
      })
    }
    .height('100%')
    .width('100%')
  }
  //生命周期感知对象
  getLifecycle(): Lifecycle {
    return this.mLifecycle
  }
}

A页面消息发送后,B页面接收消息。此时您还在A页面。当您路由到B页面 message会重新赋值Hello World ( @State message: string = ‘Hello World’;)。 如果作用域的问题,可以通过const that = this解决 PageA.ets

import { router } from '[@kit](/user/kit).ArkUI';
import { LiveEventBus } from '[@ohos](/user/ohos)/liveeventbus';
[@Entry](/user/Entry)
[@Component](/user/Component)
struct PageA {
  build() {
    Scroll() {
      Column() {
        Button('跳转B页面3s后发送消息').margin({ bottom: '10vp' }).onClick(() => {
          setTimeout(()=>{
            LiveEventBus.get<string>("aaa").post("lalala");
          },3000)
          router.pushUrl({
            url: 'pages/PageB'
          })
        })
      }
    }
  }
}

PageB.ets

import { LiveEventBus, Lifecycle, MState } from '[@ohos](/user/ohos)/liveeventbus';
import { router } from '[@kit](/user/kit).ArkUI';
[@Entry](/user/Entry)
[@Component](/user/Component)
struct PageB {
  [@State](/user/State) message: string = 'Hello World';
  [@StorageLink](/user/StorageLink)('aaa') msg: string = '';
  observeFlag: boolean = false;
  mLifecycle: Lifecycle = new Lifecycle(MState.STARTED);
  aboutToAppear() {
    //创建生命周期感知对象
    this.mLifecycle = new Lifecycle(MState.STARTED)
    //订阅消息
   //如果作用域的问题,可以通过const that = this解决
    const  that = this
    LiveEventBus
      .get<string>('aaa')
      .observe(this, {
        onChanged(s: string) {
          that.message = s
          // AppStorage.setOrCreate('aaa', s)
        }
      });
  }
  build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(()=> {
          router.back()
        })
      Text(this.msg)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(()=> {
          router.back()
        })
      Button('手动修改').onClick(() => {
        this.message = "手动修改"
      })
      Button('发送消息').onClick(() => {
        LiveEventBus.get<string>("aaa").post("lalala2222");
      })
    }
    .height('100%')
    .width('100%')
  }
  //生命周期感知对象
  getLifecycle(): Lifecycle {
    return this.mLifecycle
  }
}

更多关于HarmonyOS鸿蒙Next中使用LiveEventBus接受消息后无法修改变量值的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用LiveEventBus接收消息后无法修改变量值,可能是由于以下几个原因:

  1. 线程问题:LiveEventBus默认在主线程中接收消息。如果尝试在非UI线程中修改变量值,可能会导致UI更新问题。确保在UI线程中执行变量修改操作。

  2. 观察者生命周期:LiveEventBus的观察者(Observer)与组件的生命周期绑定。如果观察者在接收消息时已经处于非活跃状态(如后台或销毁状态),则无法接收到消息或修改变量值。检查观察者的生命周期状态。

  3. 事件类型匹配:确保发送的事件类型与接收的事件类型匹配。如果类型不匹配,观察者将无法接收到消息,从而无法修改变量值。

  4. 事件处理逻辑:在事件处理逻辑中,确保正确地修改变量值。如果在处理逻辑中忽略了变量修改步骤,或者逻辑错误,将导致变量值无法更新。

  5. 变量作用域:确保要修改的变量在事件处理逻辑中是可访问的。如果变量作用域受限,可能导致无法修改变量值。

  6. LiveEventBus配置:检查LiveEventBus的配置,确保没有设置阻止事件传递或处理的配置项。

通过排查上述问题,可以解决在HarmonyOS鸿蒙Next中使用LiveEventBus接收消息后无法修改变量值的情况。

在HarmonyOS鸿蒙Next中使用LiveEventBus接收消息时,如果无法修改变量值,可能是以下原因:

  1. 线程问题:确保在UI线程中更新UI相关的变量。可以使用HandlerTaskDispatcher切换到主线程。

  2. 生命周期问题:检查接收消息的组件(如Activity或Service)是否处于活动状态。如果组件已销毁,更新操作可能无效。

  3. 事件类型匹配:确保发送和接收的事件类型一致,避免类型不匹配导致无法正确处理。

  4. 变量作用域:检查变量作用域,确保在接收消息的方法中可以访问并修改变量。

  5. LiveEventBus配置:检查LiveEventBus的配置,确保事件被正确注册和接收。

通过以上步骤排查问题,通常可以解决变量无法更新的情况。

回到顶部