HarmonyOS鸿蒙Next中为什么getContext(this)废弃了,改成this.getUIContext().getHostContext()报错

HarmonyOS鸿蒙Next中为什么getContext(this)废弃了,改成this.getUIContext().getHostContext()报错 报错信息:Property ‘getUIContext’ does not exist on type ‘RdbStoreUtils’.

cke_213.png


更多关于HarmonyOS鸿蒙Next中为什么getContext(this)废弃了,改成this.getUIContext().getHostContext()报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

16 回复

在非UI组件想要获取getUIContext时,可以定义一个方法将getContext转换成getUIContext,示例代码如下:

export async function getLastWindowUiContext() {
  return (await window.getLastWindow(getContext()))?.getUIContext();
}

更多关于HarmonyOS鸿蒙Next中为什么getContext(this)废弃了,改成this.getUIContext().getHostContext()报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


上面的getContext()在api18后还是摭弃了,在Util类声明里,还有其它方法可以替代下面代码吗? let context = getContext(this) as common.UIAbilityContext;

可以尝试这样用:

let c = new UIContext();

为什么我改成这样会报一下错误: Argument of type ‘UIContext’ is not assignable to parameter of type ‘UIAbilityContext’. Type ‘UIContext’ is missing the following properties from type ‘UIAbilityContext’: abilityInfo, currentHapModuleInfo, config, windowStage, and 47 more. <ArkTSCheck>,

getUIContext()仅在ArkUI组件作用域可用,比如@Component修饰的组件内。RdbStoreUtils作为工具类不属于UI组件层级,无法直接访问组件上下文。

获取方式需要根据不同的场景!!!

UI组件内

[@Component](/user/Component)
struct MyComponent {
  build() {
    // 组件作用域内可直接获取
    const hostContext = this.getUIContext().getHostContext()
  }
}

工具类/普通类

// 通过AppStorageV2访问共享上下文
const context = AppStorageV2.get(UIContext)?.getHostContext()

// 或使用connect方法建立关联
AppStorageV2.connect(UIContext, 'uiContext', () => new UIContext())

Ability生命周期

// 在EntryAbility的onWindowStageCreate中
onWindowStageCreate(windowStage: window.WindowStage) {
  const win = windowStage.getMainWindow()
  const uiContext = win.getUIContext()
  const hostContext = uiContext.getHostContext()
}

可能是为了避免还没有Context就去获取这个,代码逻辑性就不对,所以在UI组件里面去获取这个Context更符合逻辑,

UIContext只有页面或者组件才能拿到,工具类需要用到的话需要传参UIContext

作用域限制:getUIContext() 是 ArkUI 组件实例方法(如 UIAbility 或自定义组件中),无法直接在工具类或纯逻辑代码中通过 this 调用

先存一份也行,或者直接上三方库吧

[https://ohpm.openharmony.cn/#/cn/detail/@pura%2Fharmony-utils](https://ohpm.openharmony.cn/#/cn/detail/@pura%2Fharmony-utils)

AppUtil.getUIContext

新API好像已经弃用了,

你在class里面使用this,当前this指向的是RdbStoreUtils这个对象。因为你的对象里面没有getUIContext方法所以报错。你如果要在这里使用,就写一个包含Context类型的参数的有参构造器,在你new这个对象的时候传入你在调用构造器之前get到的Context对象。

这样不报错

cke_119.png

如何将 HTML 转换为 Markdown

1. 使用在线转换工具

在线工具是最快捷的转换方式,无需安装任何软件。

推荐工具:

操作步骤:

  1. 打开转换工具网站
  2. 将 HTML 代码粘贴到输入框
  3. 点击转换按钮
  4. 复制生成的 Markdown 代码

2. 使用编程库

对于需要批量处理或集成到项目中的情况,可以使用编程库。

Python 示例(使用 html2text):

import html2text

html_content = "<h1>标题</h1><p>段落内容</p>"
markdown = html2text.html2text(html_content)
print(markdown)

JavaScript 示例(使用 Turndown):

const TurndownService = require('turndown')
const turndownService = new TurndownService()
const markdown = turndownService.turndown('<h1>标题</h1>')
console.log(markdown)

3. 手动转换常用标签

了解基本对应关系有助于手动调整:

HTML 标签 Markdown 语法
<h1>-<h6> #-######
<p> 空行分隔段落
<a href="url">文本</a> [文本](url)
<img src="url" alt="文本"> ![文本](url)
<ul><li>项目</li></ul> - 项目
<ol><li>项目</li></ol> 1. 项目
<strong><b> **文本**
<em><i> *文本*
<code> `代码`
<blockquote> > 引用内容
<hr> ---***

4. 转换注意事项

  1. 表格处理:部分工具可能无法完美转换复杂表格,需要手动调整
  2. 嵌套结构:多层嵌套的列表或引用可能需要检查格式
  3. 样式丢失:HTML 中的 CSS 样式无法转换到 Markdown
  4. 特殊字符:注意转义 Markdown 中的特殊字符(如 *, _, # 等)

5. 转换后检查

转换完成后建议检查:

  • 标题级别是否正确
  • 链接和图片是否正常显示
  • 列表缩进是否一致
  • 代码块语言标识是否正确

选择合适的方法取决于你的具体需求:一次性转换推荐在线工具,自动化处理推荐编程库。

那能替换成什么使用呢?,

在HarmonyOS Next中,getContext(this)已废弃,改用this.getUIContext().getHostContext()。报错可能因this未指向UI组件实例,或组件未正确初始化。需确保在UI组件生命周期内调用,如aboutToAppear之后。

在HarmonyOS Next中,getContext(this) 被废弃是API设计演进的结果,目的是提供更清晰、职责分离的上下文获取方式。新的设计将UI上下文(UIContext)与业务逻辑上下文(如AbilityContext)进行了更明确的区分。

从你的报错信息来看,问题在于 RdbStoreUtils 类(一个工具类或非UI组件)中尝试调用 this.getUIContext()getUIContext() 方法是 UI组件(如ComponentPageCustomDialog等)才具备的方法。你的 RdbStoreUtils 类很可能没有继承或实现任何UI组件基类,因此其 this 实例上自然不存在 getUIContext() 方法。

解决方案:

你需要根据 RdbStoreUtils 类被调用的场景,获取正确的上下文:

  1. 如果是在UI组件(如Page)内部调用RdbStoreUtils的方法: 你应该将UI组件的上下文(Context)或UI上下文(UIContext)作为参数传递给 RdbStoreUtils 的方法。

    示例:

    // 在Page中
    import { RdbStoreUtils } from '../utils/RdbStoreUtils';
    
    @Entry
    @Component
    struct MyPage {
      private rdbUtils: RdbStoreUtils = new RdbStoreUtils();
    
      aboutToAppear() {
        // 将UI组件的上下文传递给工具类方法
        this.rdbUtils.someOperation(this.getUIContext().getHostContext());
        // 或者直接传递AbilityContext(如果方法需要)
        // this.rdbUtils.someOperation(getContext(this));
      }
    }
    
    // 在 RdbStoreUtils 中
    export class RdbStoreUtils {
      someOperation(context: common.Context) {
        // 使用传入的context进行操作,例如创建RDB
        const rdbStore = ... // 使用 context
      }
    }
    
  2. 如果RdbStoreUtils本身需要在初始化时持有上下文: 考虑在工具类的构造函数中接收上下文。

    示例:

    export class RdbStoreUtils {
      private context: common.Context;
    
      constructor(context: common.Context) {
        this.context = context;
      }
    
      // ... 其他方法使用 this.context
    }
    
    // 在UI组件中初始化
    private rdbUtils: RdbStoreUtils = new RdbStoreUtils(this.getUIContext().getHostContext());
    

核心要点总结:

  • getUIContext() 是UI组件的专属方法,用于获取与UI渲染相关的上下文。非UI组件不应尝试调用它。
  • getUIContext().getHostContext() 返回的是AbilityContext(或更通用的Context),这才是许多系统服务(如RDB、文件管理)所需的上下文。
  • 废弃getContext(this) 并推荐新API,是为了促使开发者明确区分UI生命周期和业务逻辑所需的上下文,避免在UI组件中滥用全局性的上下文。
  • 对于工具类、服务类等非UI组件,正确的做法是从UI组件层将所需的上下文(通常是AbilityContext)传递下去,而不是在工具类内部尝试获取。

因此,请修改你的 RdbStoreUtils 类的设计,使其通过参数或构造函数依赖注入的方式接收 Context 对象,而不是在类内部使用 this.getUIContext()

回到顶部