最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在鴻蒙上使用webview_flutter包的詳細示例

 更新時間:2026年02月07日 11:05:44   作者:進擊的前棧  
webview_flutter是Flutter官方推出的一款用于Flutter上的webview插件,下面這篇文章主要介紹了在鴻蒙上使用webview_flutter包的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1. 插件介紹

webview_flutter 是一個功能強大的 Flutter 插件,提供了 WebView 小部件,允許開發(fā)者在 Flutter 應用中嵌入網(wǎng)頁內容。該插件支持多種平臺,包括 iOS、Android、Web 和鴻蒙(API 12+)。

核心功能

  • 在 Flutter 應用中無縫嵌入網(wǎng)頁內容
  • 支持網(wǎng)絡資源、本地文件和 Flutter 資源加載
  • 提供完整的網(wǎng)頁導航控制(前進、后退、刷新)
  • 支持 JavaScript 執(zhí)行和雙向通信
  • 提供網(wǎng)頁加載進度監(jiān)聽和導航?jīng)Q策控制
  • 支持自定義用戶代理、背景顏色和縮放控制

鴻蒙平臺支持

在鴻蒙平臺上,webview_flutter 插件基于鴻蒙的 WebView API(API 12+)實現(xiàn),提供與其他平臺一致的功能體驗。支持鴻蒙 API 12 及以上版本。

2. 依賴引入

由于這是一個針對鴻蒙平臺的自定義修改版本,需要通過 git 形式引入依賴。

配置步驟

  1. 在項目的 pubspec.yaml 文件中,添加以下依賴配置:
dependencies:
  webview_flutter:
    git:
      url: "https://gitcode.com/openharmony-tpc/flutter_packages.git"
      path: "packages/webview_flutter"
  1. 執(zhí)行以下命令獲取依賴:
flutter pub get

3. 鴻蒙平臺特殊配置

3.1 權限配置

  1. 添加網(wǎng)絡權限:在 entry/src/main/module.json5 文件中添加網(wǎng)絡權限聲明:
"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET",
    "reason": "$string:network_reason",
    "usedScene": {
      "abilities": ["EntryAbility"],
      "when": "inuse"
    }
  }
]
  1. 添加權限描述:在 entry/src/main/resources/base/element/string.json 文件中添加權限描述:
{
  "string": [
    {
      "name": "network_reason",
      "value": "使用網(wǎng)絡訪問網(wǎng)頁內容"
    }
  ]
}

3.2 應用級別配置

由于 WebView 可能需要系統(tǒng)級權限,需要將應用級別設置為 system_basic,否則在安裝 HAP 包時可能會報錯。具體配置方法請參考華為官方文檔。

4. API 調用與使用示例

4.1 創(chuàng)建 WebViewController

WebViewController 是控制 WebView 行為的核心類,用于加載內容、控制導航和執(zhí)行 JavaScript 等操作。

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewExample extends StatefulWidget {
  const WebViewExample({Key? key}) : super(key: key);

  @override
  State<WebViewExample> createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<WebViewExample> {
  late final WebViewController _controller;

  @override
  void initState() {
    super.initState();
    
    // 創(chuàng)建 WebViewController
    _controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted) // 啟用 JavaScript
      ..setBackgroundColor(const Color(0x00000000)) // 設置透明背景
      ..setNavigationDelegate( // 設置導航委托
        NavigationDelegate(
          onProgress: (int progress) {
            // 更新加載進度
            debugPrint('WebView is loading (progress : $progress%)');
          },
          onPageStarted: (String url) {
            debugPrint('Page started loading: $url');
          },
          onPageFinished: (String url) {
            debugPrint('Page finished loading: $url');
          },
          onWebResourceError: (WebResourceError error) {
            debugPrint('\n\n====\nError: $error\n====\n\n');
          },
          onNavigationRequest: (NavigationRequest request) {
            // 控制導航?jīng)Q策
            if (request.url.startsWith('https://www.youtube.com/')) {
              debugPrint('blocking navigation to ${request.url}');
              return NavigationDecision.prevent;
            }
            debugPrint('allowing navigation to ${request.url}');
            return NavigationDecision.navigate;
          },
        ),
      )
      ..loadRequest(Uri.parse('https://flutter.dev')); // 加載初始 URL
  }

  // ...
}

4.2 創(chuàng)建 WebViewWidget

WebViewWidget 用于在 Flutter 界面中顯示 WebView 內容,需要傳入之前創(chuàng)建的 WebViewController。

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text('Flutter WebView 示例'),
      // 添加導航控制按鈕
      actions: [
        NavigationControls(_controller),
      ],
    ),
    body: WebViewWidget(controller: _controller), // 顯示 WebView
  );
}

4.3 實現(xiàn)導航控制

class NavigationControls extends StatelessWidget {
  const NavigationControls(this._webViewController, {Key? key}) : super(key: key);

  final WebViewController _webViewController;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        IconButton(
          icon: const Icon(Icons.arrow_back_ios),
          onPressed: () async {
            if (await _webViewController.canGoBack()) {
              await _webViewController.goBack();
            } else {
              if (context.mounted) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(content: Text('No back history item')),
                );
              }
            }
          },
        ),
        IconButton(
          icon: const Icon(Icons.arrow_forward_ios),
          onPressed: () async {
            if (await _webViewController.canGoForward()) {
              await _webViewController.goForward();
            } else {
              if (context.mounted) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(content: Text('No forward history item')),
                );
              }
            }
          },
        ),
        IconButton(
          icon: const Icon(Icons.replay),
          onPressed: () => _webViewController.reload(),
        ),
      ],
    );
  }
}

4.4 執(zhí)行 JavaScript

// 執(zhí)行 JavaScript 代碼
_controller.runJavaScript('alert("Hello from Flutter!");');

// 執(zhí)行 JavaScript 代碼并獲取返回結果
final result = await _controller.runJavaScriptReturningResult(
  'document.body.innerText.length'
);
debugPrint('Body text length: $result');

4.5 監(jiān)聽 JavaScript 消息

// 添加 JavaScript 通道
_controller.addJavaScriptChannel(
  'Toaster',
  onMessageReceived: (JavaScriptMessage message) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(message.message)),
    );
  },
);

// 在網(wǎng)頁中發(fā)送消息到 Flutter
// window.Toaster.postMessage('Hello from JavaScript!');

4.6 加載不同類型的內容

// 加載網(wǎng)絡資源
_controller.loadRequest(Uri.parse('https://flutter.dev'));

// 加載本地文件
_controller.loadFile('/path/to/local/file.html');

// 加載 Flutter 資源
_controller.loadFlutterAsset('assets/html/index.html');

// 加載 HTML 字符串
_controller.loadHtmlString('''
<html>
<body>
  <h1>Hello, World!</h1>
  <p>This is HTML content loaded from a string.</p>
</body>
</html>
''', baseUrl: Uri.parse('https://example.com'));

5. 注意事項

5.1 權限配置

確保正確配置網(wǎng)絡權限,否則 WebView 將無法加載網(wǎng)絡資源。同時,注意應用級別的設置,避免安裝時出現(xiàn)權限錯誤。

5.2 鴻蒙平臺兼容性

  • 支持鴻蒙 API 12 及以上版本
  • 要求 Flutter 版本:3.7.12-ohos-1.1.1 及以上
  • 要求鴻蒙 SDK 版本:5.0.0(12) 及以上

5.3 性能優(yōu)化

  • 避免在 WebView 中加載過于復雜的網(wǎng)頁內容
  • 合理使用 JavaScript 通道,避免頻繁的雙向通信
  • 在不需要時及時釋放 WebView 資源

5.4 安全性考慮

  • 謹慎處理來自網(wǎng)頁的 JavaScript 消息
  • 對加載的網(wǎng)頁內容進行適當?shù)陌踩炞C
  • 考慮使用內容安全策略 (CSP) 保護應用

6. 總結

webview_flutter 是一個功能強大的 Flutter 插件,為開發(fā)者提供了在 Flutter 應用中嵌入網(wǎng)頁內容的能力。在鴻蒙平臺上,該插件提供了與其他平臺一致的功能體驗,支持網(wǎng)絡資源加載、JavaScript 執(zhí)行、導航控制等核心功能。

使用該插件的關鍵步驟包括:

  1. 通過 git 形式引入自定義修改版本的依賴
  2. 配置網(wǎng)絡權限和應用級別
  3. 創(chuàng)建 WebViewController 并配置導航委托
  4. 使用 WebViewWidget 在界面中顯示 WebView
  5. 實現(xiàn)導航控制和 JavaScript 交互

webview_flutter 插件為鴻蒙平臺上的 Flutter 應用提供了強大的網(wǎng)頁嵌入能力,使開發(fā)者能夠輕松構建混合內容應用,結合原生應用的性能優(yōu)勢和網(wǎng)頁內容的靈活性。

無論是構建需要嵌入外部網(wǎng)頁的應用,還是需要實現(xiàn)復雜網(wǎng)頁交互的功能,webview_flutter 都是鴻蒙平臺上 Flutter 開發(fā)者的理想選擇。

到此這篇關于在鴻蒙上使用webview_flutter包的文章就介紹到這了,更多相關鴻蒙使用webview_flutter包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • webstorm配置eslint一鍵格式化代碼的方法詳解

    webstorm配置eslint一鍵格式化代碼的方法詳解

    在項目中我們?yōu)榱舜a書寫更規(guī)范,在項目中安裝ESlint幫助我們檢查語法,這篇文章主要給大家介紹了關于webstorm配置eslint一鍵格式化代碼的相關資料,需要的朋友可以參考下
    2024-02-02
  • C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站

    C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站

    這篇文章主要為大家詳細介紹了如何分別使用C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • centos部署open-webui的完整流程記錄

    centos部署open-webui的完整流程記錄

    這篇文章主要介紹了centos部署open-webui的完整流程,OpenWebUI是一個開源的Web用戶界面工具,用于與本地或私有化部署的大語言模型交互,文中將步驟介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • win10環(huán)境下使用Hyper-V進行虛擬機創(chuàng)建的教程(圖解)

    win10環(huán)境下使用Hyper-V進行虛擬機創(chuàng)建的教程(圖解)

    這篇文章主要介紹了win10環(huán)境下使用Hyper-V進行虛擬機創(chuàng)建的教程,本文圖文詳解給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • 詳解inet_pton()和inet_ntop()函數(shù)

    詳解inet_pton()和inet_ntop()函數(shù)

    這篇文章主要介紹了inet_pton()和inet_ntop()函數(shù),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 微信小程序配置服務器域名詳細圖文教程

    微信小程序配置服務器域名詳細圖文教程

    每個微信小程序都要在上線前配置好服務器域名,不然會顯示白屏,需要小程序開發(fā)者在小程序后臺操作設置,下面這篇文章主要給大家介紹了關于微信小程序配置服務器域名的詳細圖文教程,需要的朋友可以參考下
    2024-02-02
  • OpenManus本地部署實戰(zhàn)親測有效完全免費(最新推薦)

    OpenManus本地部署實戰(zhàn)親測有效完全免費(最新推薦)

    文章介紹了如何在本地部署OpenManus大語言模型,包括環(huán)境搭建、LLM編程接口配置和測試步驟,本文給大家講解的非常詳細,感興趣的朋友一起看看吧
    2025-03-03
  • Web前端和JAVA應該學哪個?哪個就業(yè)形勢更勝一籌?

    Web前端和JAVA應該學哪個?哪個就業(yè)形勢更勝一籌?

    這篇文章主要介紹了Web前端和JAVA應該學哪個?哪個就業(yè)形勢更好?本文通過幾個城市的薪資收入對比分析,需要的朋友可以參考下
    2020-07-07
  • Uint?和?int?的區(qū)別解析

    Uint?和?int?的區(qū)別解析

    Int與Uint的區(qū)別在于帶符號與不帶符號,在計算機中根據(jù)補碼進行互相轉換,很多語言是有方法支持的,但是也有一些并沒有轉換方法,比如SQLserver(SQLserver不支持Uint類型),下面詳細介紹Uint?和?int?的區(qū)別,感興趣的朋友一起看看吧
    2023-08-08
  • curl和wget檢測網(wǎng)頁狀態(tài)的區(qū)別

    curl和wget檢測網(wǎng)頁狀態(tài)的區(qū)別

    curl和Wget在linux日常使用中非常常見,它們都可以向服務器發(fā)出請求,curl和Wget的一個最明顯的區(qū)別是:默認情況下Wget將查詢的網(wǎng)頁保存到系統(tǒng),而?curl將其顯示在終端輸出中但不保存它,curl的使用率比Wget多得多
    2025-04-04

最新評論

巩义市| 满城县| 龙陵县| 剑川县| 鸡西市| 光泽县| 邹平县| 涡阳县| 赣榆县| 青海省| 偏关县| 陇南市| 定陶县| 离岛区| 镶黄旗| 宣城市| 湘潭县| 富源县| 青州市| 南投县| 西盟| 连江县| 红河县| 丰原市| 宁明县| 梅河口市| 巴南区| 繁峙县| 于田县| 阳春市| 石城县| 建宁县| 石嘴山市| 黔江区| 仁布县| 汨罗市| 屏南县| 武义县| 苍山县| 新民市| 怀宁县|