鴻蒙網(wǎng)絡(luò)編程系列46-倉頡版Web組件加載網(wǎng)頁的三種方式

1. Web組件簡介

本系列的第18篇文章《鴻蒙網(wǎng)絡(luò)編程系列18-Web組件加載網(wǎng)頁的四種方式示例》中,使用ArkTS語言基于API 9環(huán)境演示了Web組件四種加載網(wǎng)頁內(nèi)容的方式芽世,其中就包括使用WebviewController的loadData方法直接加載HTML腳本的方式聋呢。不過,目前的倉頡版本還不支持loadData方法触机,因此帚戳,本文將基于API 12環(huán)境演示W(wǎng)eb組件加載網(wǎng)頁的其他三種方式玷或。

2. Web組件加載網(wǎng)頁演示

本示例運行后的頁面如圖所示:

image.png

在這種默認的情況下,使用的是加載資源文件的方式片任,也就是預先把html文件作為資源文件嵌入到應(yīng)用中偏友,然后在初始化web組件時作為src屬性傳入:

Web(src: @rawfile("index.html"), controller: controller)

第二種方式是直接加載網(wǎng)址,輸入網(wǎng)址后蚂踊,單擊網(wǎng)址后面的“加載”按鈕即可進行網(wǎng)頁加載约谈,如圖所示:

image.png

第三種方式是加載本地html文件,單擊“選擇”按鈕犁钟,選擇本地html文件棱诱,如圖所示:

image.png

選擇文件后,單擊“完成”按鈕回到主界面涝动,再單擊“加載按鈕”即可加載本地html文件迈勋,如圖所示:


image.png

3. HWeb組件加載網(wǎng)頁示例編寫

下面詳細介紹創(chuàng)建該示例的步驟(確保DevEco Studio已安裝倉頡插件)。

步驟1:創(chuàng)建[Cangjie]Empty Ability項目醋粟。

步驟2:在module.json5配置文件加上對權(quán)限的聲明:

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]

這里添加了訪問互聯(lián)網(wǎng)的權(quán)限靡菇。

步驟3:在build-profile.json5配置文件加上倉頡編譯架構(gòu):

"cangjieOptions": {
      "path": "./src/main/cangjie/cjpm.toml",
      "abiFilters": ["arm64-v8a", "x86_64"]
    }

步驟4:在main_ability.cj文件里添加如下的引用:

import ohos.ability.*

然后定義變量globalContext:

var globalContext: Option<AbilityContext> = Option<AbilityContext>.None

在onCreate函數(shù)里添加如下的代碼:

globalContext = this.context

步驟5:創(chuàng)建index.html文件,并添加如下的代碼:

<!-- index.html -->
<!DOCTYPE html>
<html>

<body style="font-size: large;text-align: center;">
<div style="color:blue">Hello HarmonyOS Next</div>
<div>Load with resource file</div>
</body>

</html>

把index.html文件作為資源文件嵌入到應(yīng)用中:

步驟6:在index.cj文件里添加如下的代碼:

package ohos_app_cangjie_entry

import ohos.base.*
import ohos.component.*
import ohos.state_manage.*
import ohos.state_macro_manage.*
import std.collection.HashMap
import ohos.net.http.*
import ohos.file_picker.*
import ohos.ability.getStageContext
import ohos.ability.*
import ohos.file_fs.*
import ohos.webview.*

@Entry
@Component
class EntryView {
    @State
    var title: String = '倉頡版Web加載示例';

    //要加載的網(wǎng)址
    @State
    var webUrl: String = "https://******"
    //要加載的文件
    @State
    var loadFileUri: String = ""

    let scroller: Scroller = Scroller()
    let controller: WebviewController = WebviewController()
    func build() {
        Row {
            Column {
                Text(title).fontSize(14).fontWeight(FontWeight.Bold).width(100.percent).textAlign(TextAlign.Center).
                    padding(10)

                Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {
                    Text("網(wǎng)址:").fontSize(14)

                    TextInput(text: webUrl).onChange({
                        value => webUrl = value
                    }).width(100).fontSize(11).flexGrow(1)

                    Button("加載").onClick {
                        evt => this.controller.loadUrl(this.webUrl);
                    }.width(70).fontSize(14)
                }.width(100.percent).padding(10)

                Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {
                    Text("文件:").fontSize(14)

                    TextInput(text: loadFileUri).onChange({
                        value => loadFileUri = value
                    }).width(100).fontSize(11).flexGrow(1)

                    Button("選擇").onClick {
                        evt => selectLoadFile();
                    }.width(70).fontSize(14)

                    Button("加載").onClick {
                        evt => loadLocalFile()
                    }.width(70).fontSize(14)
                }.width(100.percent).padding(10)

                Scroll(scroller) {
                    Web(src: @rawfile("index.html"), controller: controller).domStorageAccess(true).fileAccess(true).
                        padding(10).width(100.percent).backgroundColor(0xeeeeee)
                }.align(Alignment.Top).backgroundColor(0xeeeeee).height(300).flexGrow(1).scrollable(
                    ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarWidth(20)
            }.width(100.percent).height(100.percent)
        }.height(100.percent)
    }

    //選擇需要加載的文件
    func selectLoadFile() {
        let option = DocumentSelectOptions(maxSelectNumber: 1, selectMode: DocumentSelectMode.MIXED)
        let documentPicker = DocumentViewPicker(globalContext.getOrThrow())

        let documentSelectCallback = {
            errorCode: Option<AsyncError>, data: Option<Array<String>> => match (errorCode) {
                case Some(e) => ()
                case _ => match (data) {
                    case Some(value) => loadFileUri = value[0]
                    case _ => ()
                }
            }
        }
        documentPicker.select(documentSelectCallback, option: option)
    }

    //加載本地文件
    func loadLocalFile() {
        let segments = this.loadFileUri.split('/')
        //文件名稱
        let fileName = segments[segments.size - 1] + ".html"

        //計劃復制到的目標路徑
        let realUri = globalContext.getOrThrow().filesDir + "/" + fileName

        //復制選擇的文件到沙箱cache文件夾
        let file = FileFs.open(this.loadFileUri);
        FileFs.copyFile(file.fd, realUri)
        FileFs.close(file);
        this.controller.loadUrl("file://${realUri}");
    }
}

步驟7:編譯運行米愿,可以使用模擬器或者真機厦凤,在當前版本下,最好使用真機育苟。

步驟8:按照本節(jié)第2部分“Web組件加載網(wǎng)頁演示”操作即可较鼓。

4. 代碼分析

在加載本地文件時,需要復制本地文件到沙箱目錄违柏,再進行加載博烂,加載時需要注意文件的路徑格式,這里使用的是file前綴漱竖,對應(yīng)代碼如下所示:

func loadLocalFile() {
        let segments = this.loadFileUri.split('/')
        //文件名稱
        let fileName = segments[segments.size - 1] + ".html"

        //計劃復制到的目標路徑
        let realUri = globalContext.getOrThrow().filesDir + "/" + fileName

        //復制選擇的文件到沙箱cache文件夾
        let file = FileFs.open(this.loadFileUri);
        FileFs.copyFile(file.fd, realUri)
        FileFs.close(file);
        this.controller.loadUrl("file://${realUri}");
    }

(本文作者原創(chuàng)禽篱,除非明確授權(quán)禁止轉(zhuǎn)載)

本文源碼地址:
https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/web/WebDemo4Cj

本系列源碼地址:
https://gitee.com/zl3624/harmonyos_network_samples

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馍惹,隨后出現(xiàn)的幾起案子躺率,更是在濱河造成了極大的恐慌,老刑警劉巖讼积,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肥照,死亡現(xiàn)場離奇詭異,居然都是意外死亡勤众,警方通過查閱死者的電腦和手機舆绎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來们颜,“玉大人吕朵,你說我怎么就攤上這事猎醇。” “怎么了努溃?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵硫嘶,是天一觀的道長。 經(jīng)常有香客問我梧税,道長沦疾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任第队,我火速辦了婚禮哮塞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凳谦。我一直安慰自己忆畅,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布尸执。 她就那樣靜靜地躺著家凯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪如失。 梳的紋絲不亂的頭發(fā)上绊诲,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音褪贵,去河邊找鬼驯镊。 笑死,一個胖子當著我的面吹牛竭鞍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橄镜,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼偎快,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洽胶?” 一聲冷哼從身側(cè)響起晒夹,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姊氓,沒想到半個月后丐怯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡翔横,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年读跷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禾唁。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡效览,死狀恐怖无切,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丐枉,我是刑警寧澤哆键,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瘦锹,受9級特大地震影響籍嘹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弯院,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一辱士、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抽兆,春花似錦识补、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贴妻,卻和暖如春切油,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背名惩。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工澎胡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娩鹉。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓攻谁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弯予。 傳聞我的和親對象是個殘疾皇子戚宦,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容