wangliang_wd

feat:优化华为协议展示问题

@@ -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()