HarmonyOS鸿蒙Next中Flutter开发如何获得common.UIAbilityContext
HarmonyOS鸿蒙Next中Flutter开发如何获得common.UIAbilityContext 之前的方案是使用 getContext,但是已经被弃用了,想问问 flutter 应用的 ArkTs 平台代码该如何正确获取需要的 common.UIAbilityContext?
实现 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
的实例化方式。具体步骤如下:
- 在ArkTS侧,通过
UIAbility
的onCreate
生命周期回调获取context
实例,并暴露给Flutter侧。 - 使用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调用。