Showing
5 changed files
with
123 additions
and
17 deletions
| @@ -4,4 +4,5 @@ export { WdWebLocalComponent } from './src/main/ets/pages/WdWebLocalComponent' | @@ -4,4 +4,5 @@ export { WdWebLocalComponent } from './src/main/ets/pages/WdWebLocalComponent' | ||
| 4 | 4 | ||
| 5 | export { WebEvents, WebNodeController } from './src/main/ets/webPool/WebLocalPool' | 5 | export { WebEvents, WebNodeController } from './src/main/ets/webPool/WebLocalPool' |
| 6 | export { WebPoolManager } from './src/main/ets/webPool/WebPoolManager' | 6 | export { WebPoolManager } from './src/main/ets/webPool/WebPoolManager' |
| 7 | -export { WebArticleEventHandler } from './src/main/ets/webPool/WebArticleEventHandler' | ||
| 7 | +export { WebArticleEventHandler } from './src/main/ets/webPool/WebArticleEventHandler' | ||
| 8 | +export { getNWeb, H5NodeController,createNWeb } from './src/main/ets/webPool/WebCommonPool' |
| 1 | +import { UIContext } from '@kit.ArkUI'; | ||
| 2 | +import { webview } from '@kit.ArkWeb'; | ||
| 3 | +import { NodeController, BuilderNode, Size, FrameNode } from '@kit.ArkUI'; | ||
| 4 | + | ||
| 5 | +class Data { | ||
| 6 | + url: string = '' | ||
| 7 | + controller:WebviewController | ||
| 8 | + | ||
| 9 | + constructor(url: string, controller: WebviewController,) { | ||
| 10 | + this.url = url | ||
| 11 | + this.controller = controller | ||
| 12 | + } | ||
| 13 | +} | ||
| 14 | +const TAG = 'WebCommonPool'; | ||
| 15 | + | ||
| 16 | +// @Builder中为动态组件的具体组件内容 | ||
| 17 | +// Data为入参封装类 | ||
| 18 | +// 调用onActive,开启渲染 | ||
| 19 | +@Builder | ||
| 20 | +function WebBuilder(data:Data) { | ||
| 21 | + Column() { | ||
| 22 | + Web({ src: data.url, controller: data.controller }) | ||
| 23 | + .onPageBegin(() => { | ||
| 24 | + data.controller.onActive(); | ||
| 25 | + }) | ||
| 26 | + .width("100%") | ||
| 27 | + .height("100%") | ||
| 28 | + } | ||
| 29 | +} | ||
| 30 | +let wrap = wrapBuilder<Data[]>(WebBuilder); | ||
| 31 | +// 用于控制和反馈对应的NodeContianer上的节点的行为,需要与NodeContainer一起使用 | ||
| 32 | +export class H5NodeController extends NodeController { | ||
| 33 | + private rootnode: BuilderNode<Data[]> | null = null; | ||
| 34 | + // 必须要重写的方法,用于构建节点数、返回节点挂载在对应NodeContianer中 | ||
| 35 | + // 在对应NodeContianer创建的时候调用、或者通过rebuild方法调用刷新 | ||
| 36 | + makeNode(uiContext: UIContext): FrameNode | null { | ||
| 37 | + console.log(" uicontext is undifined : "+ (uiContext === undefined)); | ||
| 38 | + if (this.rootnode != null) { | ||
| 39 | + // 返回FrameNode节点 | ||
| 40 | + return this.rootnode.getFrameNode(); | ||
| 41 | + } | ||
| 42 | + // 返回null控制动态组件脱离绑定节点 | ||
| 43 | + return null; | ||
| 44 | + } | ||
| 45 | + // 当布局大小发生变化时进行回调 | ||
| 46 | + aboutToResize(size: Size) { | ||
| 47 | + console.log("aboutToResize width : " + size.width + " height : " + size.height ) | ||
| 48 | + } | ||
| 49 | + // 当controller对应的NodeContainer在Appear的时候进行回调 | ||
| 50 | + aboutToAppear() { | ||
| 51 | + console.log("aboutToAppear") | ||
| 52 | + } | ||
| 53 | + // 当controller对应的NodeContainer在Disappear的时候进行回调 | ||
| 54 | + aboutToDisappear() { | ||
| 55 | + console.log("aboutToDisappear") | ||
| 56 | + } | ||
| 57 | + // 此函数为自定义函数,可作为初始化函数使用 | ||
| 58 | + // 通过UIContext初始化BuilderNode,再通过BuilderNode中的build接口初始化@Builder中的内容 | ||
| 59 | + initWeb(url:string, uiContext:UIContext, control:WebviewController) { | ||
| 60 | + if(this.rootnode != null) | ||
| 61 | + { | ||
| 62 | + return; | ||
| 63 | + } | ||
| 64 | + // 创建节点,需要uiContext | ||
| 65 | + this.rootnode = new BuilderNode(uiContext) | ||
| 66 | + // 创建动态Web组件 | ||
| 67 | + this.rootnode.build(wrap, { url:url, controller:control }) | ||
| 68 | + } | ||
| 69 | +} | ||
| 70 | +// 创建Map保存所需要的NodeController | ||
| 71 | +let NodeMap:Map<string, H5NodeController | undefined> = new Map(); | ||
| 72 | +// 创建Map保存所需要的WebViewController | ||
| 73 | +let controllerMap:Map<string, WebviewController | undefined> = new Map(); | ||
| 74 | + | ||
| 75 | + | ||
| 76 | +// 初始化需要UIContext 需在Ability获取 | ||
| 77 | +export const createNWeb = (url: string, uiContext: UIContext) => { | ||
| 78 | + // 创建NodeController | ||
| 79 | + let baseNode = new H5NodeController(); | ||
| 80 | + let controller = new webview.WebviewController() ; | ||
| 81 | + // 初始化自定义web组件 | ||
| 82 | + baseNode.initWeb(url, uiContext, controller); | ||
| 83 | + controllerMap.set(url, controller) | ||
| 84 | + NodeMap.set(url, baseNode); | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | + | ||
| 88 | +// 自定义获取NodeController接口 | ||
| 89 | +export const getNWeb = (url : string) : H5NodeController | undefined => { | ||
| 90 | + return NodeMap.get(url); | ||
| 91 | +} |
| 1 | import { BridgeWebViewControl } from "wdJsBridge" | 1 | import { BridgeWebViewControl } from "wdJsBridge" |
| 2 | import { AppUtils } from "wdKit" | 2 | import { AppUtils } from "wdKit" |
| 3 | import { createReuseableWeb, destoryReuseableWeb, getPoolWebNodeController, WebNodeController } from "./WebLocalPool" | 3 | import { createReuseableWeb, destoryReuseableWeb, getPoolWebNodeController, WebNodeController } from "./WebLocalPool" |
| 4 | +import { createNWeb} from "./WebCommonPool" | ||
| 4 | import { util } from "@kit.ArkTS" | 5 | import { util } from "@kit.ArkTS" |
| 5 | import { WebArticleEventHandler } from "./WebArticleEventHandler" | 6 | import { WebArticleEventHandler } from "./WebArticleEventHandler" |
| 6 | 7 | ||
| @@ -41,6 +42,12 @@ export class WebPoolManager { | @@ -41,6 +42,12 @@ export class WebPoolManager { | ||
| 41 | return target | 42 | return target |
| 42 | } | 43 | } |
| 43 | 44 | ||
| 45 | + createHuaWeiWeb(uiContext: UIContext){ | ||
| 46 | + createNWeb('https://privacy.consumer.huawei.com/legal/id/authentication-terms.htm?code=CN&language=zh-CN', uiContext) | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + | ||
| 50 | + | ||
| 44 | // 取一个可用的target,不存在则根据参数创建 | 51 | // 取一个可用的target,不存在则根据参数创建 |
| 45 | // 当使用完成,需要调用recycleTarget() | 52 | // 当使用完成,需要调用recycleTarget() |
| 46 | takeAvaiableArticleWebTarget(param: ArticleWebInterface): string { | 53 | takeAvaiableArticleWebTarget(param: ArticleWebInterface): string { |
| @@ -12,5 +12,7 @@ export class ComponentModule { | @@ -12,5 +12,7 @@ export class ComponentModule { | ||
| 12 | webController: webviewControl, | 12 | webController: webviewControl, |
| 13 | webArticleEventHandler: new WebArticleEventHandler(webviewControl) | 13 | webArticleEventHandler: new WebArticleEventHandler(webviewControl) |
| 14 | }) | 14 | }) |
| 15 | + | ||
| 16 | + WebPoolManager.sharedInstance().createHuaWeiWeb(context) | ||
| 15 | } | 17 | } |
| 16 | } | 18 | } |
| @@ -3,8 +3,9 @@ import webview from '@ohos.web.webview'; | @@ -3,8 +3,9 @@ import webview from '@ohos.web.webview'; | ||
| 3 | import { SpConstants } from 'wdConstant/Index'; | 3 | import { SpConstants } from 'wdConstant/Index'; |
| 4 | import { Logger, NetworkUtil, SPHelper } from 'wdKit'; | 4 | import { Logger, NetworkUtil, SPHelper } from 'wdKit'; |
| 5 | import { Params } from '../../../../../../../commons/wdRouter/oh_modules/wdBean/src/main/ets/bean/content/Params'; | 5 | import { Params } from '../../../../../../../commons/wdRouter/oh_modules/wdBean/src/main/ets/bean/content/Params'; |
| 6 | +import { WebArticleEventHandler, WebPoolManager } from 'wdWebComponent'; | ||
| 6 | import { EmptyComponent } from './EmptyComponent'; | 7 | import { EmptyComponent } from './EmptyComponent'; |
| 7 | - | 8 | +import {getNWeb} from "wdWebComponent/Index" |
| 8 | 9 | ||
| 9 | const TAG = 'LoginProtocolWebview'; | 10 | const TAG = 'LoginProtocolWebview'; |
| 10 | 11 | ||
| @@ -46,7 +47,7 @@ struct LoginProtocolWebview { | @@ -46,7 +47,7 @@ struct LoginProtocolWebview { | ||
| 46 | this.webUrl = this.thirdVendorProtocol | 47 | this.webUrl = this.thirdVendorProtocol |
| 47 | } | 48 | } |
| 48 | } | 49 | } |
| 49 | - | 50 | + |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | build() { | 53 | build() { |
| @@ -77,20 +78,24 @@ struct LoginProtocolWebview { | @@ -77,20 +78,24 @@ struct LoginProtocolWebview { | ||
| 77 | .height(1) | 78 | .height(1) |
| 78 | 79 | ||
| 79 | if(this.isConnectNetwork){ | 80 | if(this.isConnectNetwork){ |
| 80 | - Web({ src: this.webUrl, controller: this.webviewController }) | ||
| 81 | - .backgroundColor(Color.White) | ||
| 82 | - .domStorageAccess(true) | ||
| 83 | - .databaseAccess(true) | ||
| 84 | - .javaScriptAccess(true) | ||
| 85 | - .zoomAccess(false) | ||
| 86 | - .horizontalScrollBarAccess(false) | ||
| 87 | - .verticalScrollBarAccess(false) | ||
| 88 | - .onHttpErrorReceive((event) => { | ||
| 89 | - //TODO 页面加载不成功的时候处理 | ||
| 90 | - Logger.info(TAG, 'onHttpErrorReceive event.request.getRequestUrl:' + event?.request.getRequestUrl()); | ||
| 91 | - Logger.info(TAG, 'onHttpErrorReceive event.response.getResponseCode:' + event?.response.getResponseCode()); | ||
| 92 | - }) | ||
| 93 | - .padding({bottom:this.contentID === "2" ? "40lpx" : 0 }) | 81 | + if(this.contentID == "4"){ //华为用户认证协议 |
| 82 | + NodeContainer(getNWeb(this.webUrl)).backgroundColor(Color.White) | ||
| 83 | + }else { | ||
| 84 | + Web({ src: this.webUrl, controller: this.webviewController }) | ||
| 85 | + .backgroundColor(Color.White) | ||
| 86 | + .domStorageAccess(true) | ||
| 87 | + .databaseAccess(true) | ||
| 88 | + .javaScriptAccess(true) | ||
| 89 | + .zoomAccess(false) | ||
| 90 | + .horizontalScrollBarAccess(false) | ||
| 91 | + .verticalScrollBarAccess(false) | ||
| 92 | + .onHttpErrorReceive((event) => { | ||
| 93 | + //TODO 页面加载不成功的时候处理 | ||
| 94 | + Logger.info(TAG, 'onHttpErrorReceive event.request.getRequestUrl:' + event?.request.getRequestUrl()); | ||
| 95 | + Logger.info(TAG, 'onHttpErrorReceive event.response.getResponseCode:' + event?.response.getResponseCode()); | ||
| 96 | + }) | ||
| 97 | + .padding({bottom:this.contentID === "2" ? "40lpx" : 0 }) | ||
| 98 | + } | ||
| 94 | }else{ | 99 | }else{ |
| 95 | EmptyComponent({ emptyType: 1,emptyHeight:"100%" ,retry: () => { | 100 | EmptyComponent({ emptyType: 1,emptyHeight:"100%" ,retry: () => { |
| 96 | this.isConnectNetwork = NetworkUtil.isNetConnected() | 101 | this.isConnectNetwork = NetworkUtil.isNetConnected() |
-
Please register or login to post a comment