HarmonyOS鸿蒙Next中Flutter开发如何获得common.UIAbilityContext

HarmonyOS鸿蒙Next中Flutter开发如何获得common.UIAbilityContext 之前的方案是使用 getContext,但是已经被弃用了,想问问 flutter 应用的 ArkTs 平台代码该如何正确获取需要的 common.UIAbilityContext?

7 回复

实现 AbilityAware 接口

更多关于HarmonyOS鸿蒙Next中Flutter开发如何获得common.UIAbilityContext的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


【解决方案】

已过期,即打了 @deprecated 的API并不是立即不可以,而是不再推荐使用,具体 参考废弃接口说明 建议根据以下两个方案进行有计划的替换。

  • 方案一:在DEVECO STUDIO里面鼠标放在已过期的API下发,会出现提示窗,窗口会有deprecated(API几开始过期),useinstead(用什么API来替代)。
  • 方案二:在官网搜索对应的API,有deprecated标签的说明已经过期,下面会有提示,从API几开始废弃,可以用什么新的API来代替。详情参考 废弃接口说明

旧API换成新的API可以参考以下示例: (1)vp2px():建议使用 UIContext 中的 vp2px12 替代; (2)promptAction.showToast():从API version 18开始废弃,且直接使用showToast可能导致 UI上下文 不明确的问题,建议使用 UIContext 中的 getPromptAction 获取 PromptAction 实例,再通过此实例调用替代方法 showToast。 (3)getContext():该接口从API version 9开始支持,从API version 18开始废弃,建议使用UIContext中的 getHostContext 替代。

HarmonyOS的流畅动画和过渡效果让操作更加顺畅,体验极佳。

在EntryAbility的onCreate生命周期中,将UIAbilityContext注入全局单例对象:

// EntryAbility.ets

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

import { GlobalContext } from '../utils/GlobalContext';

export default class EntryAbility extends UIAbility {

  onCreate(want, launchParam) {

    GlobalContext.getInstance().setContext('uiContext', this.context);

  }

}

构建支持多线程访问的全局上下文容器:

// utils/GlobalContext.ets

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

export class GlobalContext {

  private static instance: GlobalContext;

  private _contextMap = new Map<string, common.UIAbilityContext>();

  public static getInstance(): GlobalContext {

    if (!GlobalContext.instance) {

      GlobalContext.instance = new GlobalContext();

    }

    return GlobalContext.instance;

  }

  setContext(key: string, context: common.UIAbilityContext): void {

    this._contextMap.set(key, context);

  }

  getContext(key: string): common.UIAbilityContext | undefined {

    return this._contextMap.get(key);

  }

}

在Flutter与ArkTS混合页面中,通过全局单例访问上下文:

// Flutter混合页面示例

import { GlobalContext } from '../utils/GlobalContext';

@Entry

@Component

struct FlutterHybridPage {

  private uiContext: common.UIAbilityContext = GlobalContext.getInstance().getContext('uiContext')!;

  build() {

    Column() {

      FlutterPage({

        viewId: 'flutterView',

        context: this.uiContext  // 将上下文传递给Flutter组件

      })

    }

  }

}

不是混合页面开发,EntryAbility extends 的是 FlutterAbility,

在HarmonyOS Next中使用Flutter开发时,可以通过@ohos.ability.common模块的UIAbilityContext获取上下文。具体方式是在UIAbility中调用context属性,然后传递给Flutter侧。Flutter插件可通过MethodChannel接收并存储该上下文,供后续调用鸿蒙原生API时使用。注意需在模块配置文件(module.json5)中声明所需权限。

在HarmonyOS Next中,Flutter应用通过ArkTS平台代码获取common.UIAbilityContext的正确方式是使用UIAbilityContext的实例化方式。具体步骤如下:

  1. 在ArkTS侧,通过UIAbilityonCreate生命周期回调获取context实例,并暴露给Flutter侧。
  2. 使用Flutter插件机制(如MethodChannel)将context从ArkTS传递到Dart代码中。

示例代码(ArkTS侧):

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) {
    let context = this.context; // 获取UIAbilityContext
    // 通过MethodChannel将context传递给Flutter
  }
}

注意:直接传递整个context对象可能受限,建议按需封装所需功能(如启动Ability、获取路径等)为接口供Flutter调用。

回到顶部