HarmonyOS开发实战系列:办理web组件加载网页白屏规范

打印 上一主题 下一主题

主题 836|帖子 836|积分 2508

目次
 1. web组件加载网页白屏表现
2. 白屏原因分析
3. 白屏办理方式示例
4. 加载功能分析
最后


 1. web组件加载网页白屏表现

鸿蒙体系提供了web组件,可以在APP里内嵌该组件表现网页信息,但是,许多开发者反应一种比力奇特的情况,就是在加载的网页里,假如含有字符#的话,就会出现白屏,大概是#后的内容无法表现。当然,web组件加载网页的方式比力多,在上文鸿蒙开发实战系列-Web组件加载网页的四种方式示例里已经介绍了,这种出现白屏的情况,一般都是因为使用了WebviewController的loadData方法举行加载。
2. 白屏原因分析

WebviewController可以通过loadUrl大概loadData举行内容的加载,但是,在WebviewController的底层,调用的方法是不一样的,底层代码如下所示:
  1. ErrCode WebviewController::LoadUrl(std::string url, std::map<std::string, std::string> httpHeaders)
  2. {
  3.     auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
  4.     if (!nweb_ptr) {
  5.         return INIT_ERROR;
  6.     }
  7.     return nweb_ptr->Load(url, httpHeaders);
  8. }
  9. ErrCode WebviewController::LoadData(std::string data, std::string mimeType, std::string encoding,
  10.     std::string baseUrl, std::string historyUrl)
  11. {
  12.     auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
  13.     if (!nweb_ptr) {
  14.         return INIT_ERROR;
  15.     }
  16.     if (baseUrl.empty() && historyUrl.empty()) {
  17.         return nweb_ptr->LoadWithData(data, mimeType, encoding);
  18.     }
  19.     return nweb_ptr->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
  20. }
复制代码
也就是说,问题是出在底层的组件上,鸿蒙体系对此也是爱莫能助。在调用LoadWithData(data, mimeType, encoding)大概LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl)时,须要注意一点,就是对于data中的内容,假如含有符号#的话,被认为是须要转义的,也就是说要转换成%23,否则就会出现表现问题。假如你不想转义,实在也有办法,就是把data中的内容举行base64编码,然后把encoding参数设置为“base64”就可以了。须要注意的是,这里要小写,不能写成Base64
3. 白屏办理方式示例

本示例将演示html内容白屏表现以及办理白屏问题的示例,运行后的初始界面如下所示:


下面详细介绍创建该应用的步骤。
步骤1:创建Empty Ability项目。
步骤2:在module.json5配置文件加上对权限的声明:
  1. "requestPermissions": [
  2.       {
  3.         "name": "ohos.permission.INTERNET"
  4.       }
  5.     ]
复制代码
这里添加了获取互联网信息的权限。
步骤3:在Index.ets文件里添加如下的代码:
  1. import util from '@ohos.util';
  2. import web_webview from '@ohos.web.webview'
  3. @Entry
  4. @Component
  5. struct Index {
  6.   //要加载的内容
  7.   @State webContent: string = `<!DOCTYPE html>
  8. <html>
  9. <body style="font-size: large;text-align: center;">
  10.   <div>前面的内容#后面的内容,咋区别对待呢!</div>
  11. </body>
  12. </html>`
  13.   scroller: Scroller = new Scroller()
  14.   contentScroller: Scroller = new Scroller()
  15.   controller: web_webview.WebviewController = new web_webview.WebviewController()
  16.   build() {
  17.     Row() {
  18.       Column() {
  19.         Text("HTML包含特殊字符示例")
  20.           .fontSize(14)
  21.           .fontWeight(FontWeight.Bold)
  22.           .width('100%')
  23.           .textAlign(TextAlign.Center)
  24.           .padding(10)
  25.         Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
  26.           Text("HTML内容:")
  27.             .fontSize(14)
  28.             .width(100)
  29.             .flexGrow(1)
  30.           Button("加载")
  31.             .onClick(() => {
  32.               this.controller.loadData(this.webContent, "text/html", "utf-8")
  33.             })
  34.             .width(80)
  35.             .fontSize(14)
  36.           Button("Base64加载")
  37.             .onClick(() => {
  38.               let base64Content = string2Base64(this.webContent)
  39.               this.controller.loadData(base64Content, "text/html", "base64")
  40.             })
  41.             .width(120)
  42.             .fontSize(14)
  43.         }
  44.         .width('100%')
  45.         .padding(5)
  46.         Scroll(this.contentScroller) {
  47.           TextArea({ text: this.webContent })
  48.             .onChange((value) => {
  49.               this.webContent = value
  50.             })
  51.             .backgroundColor(0xffffee)
  52.             .width('100%')
  53.             .fontSize(11)
  54.         }
  55.         .align(Alignment.Top)
  56.         .backgroundColor(0xeeeeee)
  57.         .height(120)
  58.         .scrollable(ScrollDirection.Vertical)
  59.         .scrollBar(BarState.On)
  60.         .scrollBarWidth(20)
  61.         Scroll(this.scroller) {
  62.           Web({ src: "about:blank", controller: this.controller })
  63.             .padding(10)
  64.             .width('100%')
  65.             .backgroundColor(0xeeeeee)
  66.         }
  67.         .align(Alignment.Top)
  68.         .backgroundColor(0xeeeeee)
  69.         .height(300)
  70.         .flexGrow(1)
  71.         .scrollable(ScrollDirection.Vertical)
  72.         .scrollBar(BarState.On)
  73.         .scrollBarWidth(20)
  74.       }
  75.       .width('100%')
  76.       .justifyContent(FlexAlign.Start)
  77.       .height('100%')
  78.     }
  79.     .height('100%')
  80.   }
  81. }
  82. //对字符串base64编码
  83. function string2Base64(src: string) {
  84.   let textEncoder = new util.TextEncoder();
  85.   let encodeValue = textEncoder.encodeInto(src)
  86.   let tool = new util.Base64Helper()
  87.   return tool.encodeToStringSync(encodeValue)
  88. }
复制代码
步骤4:编译运行,可以使用模拟器大概真机。
步骤5:单击“加载”按钮,截图如下所示:


可以看到,只表现了符号#前面的内容。
步骤6:单击“Base64加载”按钮,截图如下所示:


可以看到,表现了完整的内容。
4. 加载功能分析

在第一种加载方式中,代码如下:
  1. this.controller.loadData(this.webContent, "text/html", "utf-8")
复制代码
直接加载了输入控件中的内容,所以表现有问题。
第二种方式下,代码如下:
  1. let base64Content = string2Base64(this.webContent)
  2.               this.controller.loadData(base64Content, "text/html", "base64")
复制代码
这里对于加载的内容举行了base64编码,所以可以正常表现。
base64编码的函数如下所示:

最后


有许多小伙伴不知道学习哪些鸿蒙开发技能?不知道须要重点把握哪些鸿蒙应用开发知识点?但是又不知道从哪里动手,而且学习时频繁踩坑,最终浪费大量时间。所以本人整理了一些比力合适的鸿蒙(HarmonyOS NEXT)学习路径和一些资料的整理供小伙伴学习
点击领取→纯血鸿蒙Next全套最新学习资料
希望这一份鸿蒙学习资料能够给大家带来帮助,有须要的小伙伴自行领取~~


      
一、鸿蒙(HarmonyOS NEXT)最新学习门路

   

有了门路图,怎么能没有学习资料呢,小编也预备了一份团结鸿蒙官方发布笔记整理收纳的一套体系性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技能、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)…等技能知识点。
获取以上完整版高清学习门路,请点击→纯血版全套鸿蒙HarmonyOS学习资料
二、HarmonyOS Next 最新全套视频教程


三、《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建

四、大厂口试必问口试题

五、鸿蒙南向开发技能

六、鸿蒙APP开发必备




完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑衅,也是一个时机。只有积极应对变革,不断学习和提升本身,他们才气在这个变革的期间中立于不败之地。 

                        



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表