HarmonyOS 在应用启动的时候调用一个ets里面引用了上下文 启动会闪退

在 EntryAbility.ets 文件的

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  this.getPermission(want);
  let status =  VpuMoreCardPicPreKV.initICCardRecognizer('');
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

调用了 VpuMoreCardPicPreKV 闪退,提示闪退原因 :

Pid:20507
Uid:20020081
Reason:TypeError
Error name:TypeError
Error message:Cannot read property filesDir of undefined
SourceCode:
  let filesDir = context.filesDir;
^
Stacktrace:
  at func_main_0 (library/src/main/ets/components/mainpage/VpuMoreCardPicPreKV.ets:14:16)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

但是在Index.ets 内调用就正常获取上下文 context 不会发生闪退

HarmonyOS
2024-12-26 14:25:52
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Heiang

经分析是context上下文获取异常,可以在工具类中把外部的context 通过参数传入处理在工具类中没有对应的this环境,所以需要把外部的context封装过来

class UtilityClass {
  constructor(context) {
    this.context = context;
  }

  doSomething() {
    // 使用this.context来访问外部传入的context
    console.log(this.context);
  }
}

// 创建实例时传入外部context
const externalContext = { data: "外部数据" };
const utilityInstance = new UtilityClass(externalContext);

// 调用方法,将使用传入的context
utilityInstance.doSomething();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

使用 new Class(uiAbilityContext)

完整代码:

1.方式一:调用方式 new VpuMoreCardPicPreKV(getContext(this) as common.UIAbilityContext).print()

定义方式

import { common } from '@kit.AbilityKit';

export class VpuMoreCardPicPreKV {
  context: common.UIAbilityContext | null = null
  constructor(context: common.UIAbilityContext) {
    this.context = context
  }

  print() {
    if (this.context) {
      let filesDir = this.context.filesDir;
      console.info("fileDir  tests" + this.context.resourceManager.getRawFileContentSync("a.txt"))
      console.info("fileDir  is  " + filesDir);
      console.log("ceshi " + filesDir);
    }

  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

2.方式二:调用方式 VpuMoreCardPicPreKV22 .print()

定义方式

export class VpuMoreCardPicPreKV22 {
  static print() {
    let context = AppStorage.get("context") as common.UIAbilityContext;
    let filesDir = context.filesDir;
    console.info("fileDir  tests" + context.resourceManager.getRawFileContentSync("a.txt"))
    console.info("fileDir  is  " + filesDir);
    console.log("ceshi " + filesDir);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
分享
微博
QQ
微信
回复
2024-12-26 17:12:49


相关问题
无法从static上下文引用非static方法
10511浏览 • 1回复 待解决
如何获取应用上下文Context?
1047浏览 • 1回复 待解决
如何在普通ets文件中获取上下文Context
1577浏览 • 1回复 待解决
HarmonyOS 获取上下文Context
579浏览 • 1回复 待解决
HarmonyOS C++ 调用 ets 层函数报错退
633浏览 • 1回复 待解决
打开图库应用时偶尔退
2952浏览 • 0回复 待解决
上下文工具类方法有哪些?
756浏览 • 1回复 待解决
应用启动前会出现一个白屏。
1809浏览 • 1回复 待解决
HarmonyOS 使用Webview退
436浏览 • 1回复 待解决