
为了便于大家在使用本案例集时能够更详细的了解各个案例,本案例基于Web预渲染实现了案例介绍功能,即应用右下角的问号icon。

使用说明
案例适配说明
为确保案例正确显示其README,请确保entry模块的依赖中@ohos/xxx中的xxx与案例目录名相同
Stack() {
Navigation(this.pageStack) {
//...
}
// 帮助功能:在每个案例的右下角添加“帮助”功能
HelperView()
} build() {
Image($r("app.media.help"))
.bindSheet($$this.isShowReadMe, this.buildReadMeSheet(), {
//...
})
}
@Builder
buildReadMeSheet(): void {
//...
}DD一下: 鸿蒙开发各类文档,也可关注公众号<程序猿百晓生>获取。
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案)
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
....... /**
* Builder中为动态组件的具体组件内容
* 调用onActive,开启渲染
*/
@Builder
function WebBuilder(data: Data) {
Web({ src: data.url, controller: data.controller })
.onPageBegin(() => {
data.controller.onActive();
})
.width($r("app.string.full_size"))
.height($r("app.string.full_size"))
}
const wrap: WrappedBuilder<Data[]> = wrapBuilder<Data[]>(WebBuilder);
/**
* 用于控制和反馈对应的NodeContainer上的节点的行为,需要与NodeContainer一起使用
*/
export class NWebNodeController extends NodeController {
private rootNode: BuilderNode<Data[]> | null = null;
/**
* 必须要重写的方法,用于构建节点数、返回节点挂载在对应NodeContainer中
* 在对应NodeContainer创建的时候调用、或者通过rebuild方法调用刷新
*/
makeNode(uiContext: UIContext): FrameNode | null {
if (this.rootNode) {
return this.rootNode.getFrameNode();
}
return null; // 返回null控制动态组件脱离绑定节点
}
/**
* 自定义函数,可作为初始化函数使用
* 通过UIContext初始化BuilderNode,再通过BuilderNode中的build接口初始化@Builder中的内容
*/
initWeb(url: string, uiContext: UIContext, controller: WebviewController) {
if (this.rootNode) {
return;
}
// 创建节点与动态web组件
this.rootNode = new BuilderNode(uiContext);
this.rootNode.build(wrap, { url: url, controller: controller });
}
}
interface CurrentNode {
url: string | null;
webController: webview.WebviewController | null;
nWebController: NWebNodeController | null;
lastNetAvailable: boolean;
}
/**
* 复用webview
*/
function loadUrl(url: string): void {
if (currentNode.webController) {
currentNode.url = url;
currentNode.webController.loadUrl(url);
}
}
// 当前的Node
const currentNode: CurrentNode = { url: null, nWebController: null, webController: null, lastNetAvailable: true };
/**
* 销毁相关资源
*/
export function clearHelperWeb() {
currentNode.url = null;
currentNode.webController = null;
currentNode.nWebController = null;
}
/**
* 创建web实例,如果已经存在web实例,复用
* @param url
* @param uiContext
*/
export function createNWeb(url: string, uiContext: UIContext): void {
if (currentNode.webController && currentNode.nWebController && currentNode.url !== url || !currentNode.lastNetAvailable) {
loadUrl(url);
currentNode.lastNetAvailable = connection.hasDefaultNetSync();
return;
}
clearHelperWeb();
let baseNode = new NWebNodeController();
let controller = new webview.WebviewController();
// 初始化自定义web组件
baseNode.initWeb(url, uiContext, controller);
currentNode.url = url;
currentNode.webController = controller;
currentNode.nWebController = baseNode;
currentNode.lastNetAvailable = connection.hasDefaultNetSync();
}
/**
* 获取NodeController
*/
export function getNWeb(url: string): NWebNodeController | null {
if (currentNode.url != url || !currentNode.lastNetAvailable) {
loadUrl(url);
}
currentNode.lastNetAvailable = connection.hasDefaultNetSync();
return currentNode.nWebController;
}
/**
* 停止页面加载:当url频繁切换时使用
*/
export function stopWebLoad(): void {
if (currentNode.url && currentNode.webController) {
currentNode.webController.stop();
}
} onPageStackChange(): void {
if (!this.pageStack.size()) {
this.helperUrl = HelperConstants.HELPER_URL_HOME;
} else {
const size: number = this.pageStack.size();
let moduleName: string = this.pageStack.getAllPathName()[size-1].split('/')[1];
this.helperUrl = HelperConstants.HELPER_URL_PROTOTYPE.replace("{placeholder}", moduleName);
}
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。