在鸿蒙上使用webview_flutter包的详细示例

在鸿蒙系统上使用 webview_flutter 需要特别注意:​鸿蒙默认不支持标准的 Android View 体系,因此直接使用 webview_flutter(基于 Android WebView)在鸿蒙真机上无法运行。不过,如果你是在 ​HarmonyOS 兼容模式(API 9+)​​ 或使用 ​Flutter 鸿蒙适配版本(如 harmony_flutter)​,可以通过一些适配方法让 WebView 工作。

图片[1]_在鸿蒙上使用webview_flutter包的详细示例_知途无界

下面我会分两部分说明:

  1. 标准 Flutter 项目在鸿蒙兼容模式下的使用方式(理论可行,但有局限)​
  2. 实际可行的替代方案(推荐)​

1. 背景说明

  • webview_flutter 是 Flutter 官方插件,底层依赖 Android 的 android.webkit.WebView
  • 鸿蒙(HarmonyOS)在 API 9 及以上支持 ​ArkUI-X​ 或 ​FA/Stage 模型兼容 Android 应用,但 WebView 功能受限,尤其在纯鸿蒙应用(非兼容模式)中不可用。
  • 如果目标设备是 ​鸿蒙手机(非兼容模式)​,建议改用 ​鸿蒙原生 Web 组件​ 或 ​混合开发桥接

2. 标准 Flutter 项目在鸿蒙兼容模式下的使用示例

假设你的 Flutter 项目要运行在鸿蒙的 ​兼容模式(Android 兼容环境)​,那么可以像在 Android 上一样使用 webview_flutter

步骤 1:添加依赖

pubspec.yaml 中添加:

dependencies:
  webview_flutter: ^4.4.2

执行:

flutter pub get

步骤 2:平台配置(Android 部分)​

虽然目标是鸿蒙,但兼容模式下仍需按 Android 配置:

AndroidManifest.xml​(位于 android/app/src/main/):

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 其他权限 -->
</manifest>

MainActivity.java / Kotlin​(确保无冲突):
一般不需要改,但注意鸿蒙兼容模式可能限制某些硬件加速特性。

步骤 3:Flutter 代码示例

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

class WebViewPage extends StatefulWidget {
  @override
  _WebViewPageState createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  late final WebViewController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化控制器(可选,也可在 build 中直接创建)
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('鸿蒙 WebView 示例')),
      body: Column(
        children: [
          Expanded(
            child: WebView(
              initialUrl: 'https://www.example.com',
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (WebViewController webViewController) {
                _controller = webViewController;
              },
              onProgress: (int progress) {
                print('WebView is loading (progress : $progress%)');
              },
              onPageStarted: (String url) {
                print('Page started loading: $url');
              },
              onPageFinished: (String url) {
                print('Page finished loading: $url');
              },
              gestureNavigationEnabled: true,
            ),
          ),
          // 可以添加控制按钮
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              IconButton(
                icon: Icon(Icons.arrow_back),
                onPressed: () async {
                  if (await _controller.canGoBack()) {
                    _controller.goBack();
                  }
                },
              ),
              IconButton(
                icon: Icon(Icons.arrow_forward),
                onPressed: () async {
                  if (await _controller.canGoForward()) {
                    _controller.goForward();
                  }
                },
              ),
              IconButton(
                icon: Icon(Icons.refresh),
                onPressed: () {
                  _controller.reload();
                },
              ),
            ],
          )
        ],
      ),
    );
  }
}

步骤 4:运行在鸿蒙兼容模式设备

  • 将 Flutter 应用打包为 APK。
  • 在鸿蒙手机上开启“兼容模式”安装运行。
  • 注意:部分鸿蒙设备可能禁用 WebView 或限制网络访问,需测试验证。

3. 实际可行的替代方案(推荐)​

由于鸿蒙原生不支持 Android View,webview_flutter 在纯鸿蒙环境无法直接使用。推荐以下方案:

方案 A:使用鸿蒙原生 Web 组件 + Flutter 混合开发

  1. 用 ​ArkTS​ 编写包含 <web> 组件的鸿蒙页面。
  2. 通过 ​Platform Channel​ 让 Flutter 调用鸿蒙 Web 页面。
  3. 示例(鸿蒙端 ArkTS):
// HarmonyOS Web 页面
@Entry
@Component
struct WebPage {
  @State url: string = "https://www.example.com";

  build() {
    Column() {
      Web({ src: this.url })
        .width('100%')
        .height('100%')
    }
  }
}

Flutter 通过 Method Channel 跳转或直接嵌入(需自定义容器)。

方案 B:使用 flutter_inappwebview 并编译为鸿蒙兼容包

flutter_inappwebview 功能更强,但在鸿蒙兼容模式下同样依赖 Android WebView,可行性同 webview_flutter

方案 C:纯鸿蒙开发(放弃 Flutter)​

如果目标平台是纯鸿蒙(非兼容模式),建议直接用 ​ArkUI-X​ 或 ​ArkTS​ 开发,使用 <web> 组件:

// 简单示例
Web({ src: "https://example.com" })
  .width('100%')
  .height('100%')

4. 注意事项

  1. 权限​:鸿蒙需在 module.json5 中声明网络权限:
"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET"
  }
]
  1. 调试​:在鸿蒙兼容模式下,可通过 ADB 连接调试 Flutter WebView。
  2. 性能​:鸿蒙的 Android 兼容层可能对 WebView 硬件加速支持不完全,复杂网页可能卡顿。
  3. 未来趋势​:华为正在推进 ​Flutter for HarmonyOS​ 原生支持,未来可能有官方插件替代 webview_flutter

5. 总结

  • 在 ​鸿蒙兼容模式(Android 兼容环境)​​ 下,可以像 Android 一样使用 webview_flutter,但受限于鸿蒙的 WebView 实现。
  • 在 ​纯鸿蒙环境​ 下,webview_flutter 无法使用,必须改用鸿蒙原生 <web> 组件或通过 Platform Channel 桥接。
  • 目前最稳妥的方案是:​根据目标设备选择兼容模式(用 webview_flutter)或纯鸿蒙开发(用 ArkTS Web 组件)​

如果需要,我可以提供 ​Flutter 与鸿蒙原生 Web 页面桥接的完整 Platform Channel 示例,方便混合开发。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞71 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容