Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

2025-04-27 0 977

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

目录

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

一、简单介绍

二、flutter_inappwebview

1、flutter_inappwebview 实现原理

2、封装 WebViewPage 的实现方式

1)实现方式

2)注意事项

三、安装 flutter_inappwebview

四、简单效果

五、简单案例实现

六、关键代码


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

二、flutter_inappwebview

官网:flutter_inappwebview | Flutter package

flutter_inappwebview 是一个功能强大的 Flutter 插件,用于在 Flutter 应用中嵌入一个全功能的 Web 浏览器。它不仅支持加载远程网页和本地 HTML 文件,还提供了丰富的交互功能,例如执行 JavaScript 代码、监听网页加载事件、处理 HTTP 错误等。此外,它还支持与原生代码进行交互,能够处理复杂的网页交互需求。

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

1、flutter_inappwebview 实现原理

flutter_inappwebview 是一个功能强大的 Flutter 插件,用于在 Flutter 应用中嵌入一个全功能的 Web 浏览器。它基于原生平台的 WebView 组件实现,通过 Flutter 的平台通道与原生代码进行交互。在 Android 上,它使用 WebView 组件;在 iOS 上,它使用 WKWebView 组件。这种方式使得 flutter_inappwebview 能够充分利用原生平台的性能和功能,同时为 Flutter 开发者提供了一个简洁的 Dart API。

2、封装 WebViewPage 的实现方式

封装 WebViewPage 的目的是为了简化 WebView 的使用,使其更易于在不同页面中复用。以下是实现方式和注意事项:

1)实现方式
  • 定义 WebViewPage

    • 继承 StatefulWidget,并定义构造函数,接收网页地址、标题和加载事件回调函数。

    • State 类中,使用 InAppWebView 组件加载网页,并处理加载事件。

  • 设置 InAppWebView

    • 使用 initialUrlRequest 设置初始加载的 URL。

    • 通过 onWebViewCreated 获取 InAppWebViewController,用于控制 WebView。

    • 监听加载事件,如 onLoadStartonLoadStoponReceivedError,并在需要时调用回调函数。

  • 构建页面结构

    • 使用 Scaffold 构建页面,包含标题栏和 WebView。

    • 在标题栏中添加返回按钮,点击时返回上一个页面。

2)注意事项
  • 权限设置

    • 确保在 AndroidManifest.xml 中添加了必要的权限,如 INTERNET

  • 调试功能

    • 如果需要调试 WebView 中的 JavaScript,可以将 debuggingEnabled 设置为 true

  • 版本兼容性

    • 始终检查插件的最新版本和 Flutter 的版本兼容性。

  • 错误处理

    • onReceivedError 中处理加载错误,并提供友好的错误提示。

  • 性能优化

    • 在 Android 上,可以设置 useHybridCompositiontrue,以优化性能。

通过这种方式,你可以创建一个通用的 WebViewPage 组件,方便在 Flutter 应用中嵌入网页,并处理加载事件。

三、安装 flutter_inappwebview

1、直接运行命令

使用 Flutter:flutter pub add flutter_inappwebview

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

2、或者在 pubspec.yaml 添加

dependencies:
  flutter_inappwebview: ^6.1.5

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

四、简单效果

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

五、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

2、创建一个 application 的 Flutter 项目

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

3、项目结构如下

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

4、使用 flutter_inappwebview 封装一个 WebViewPage

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

5、在 main 中进行传入对应的 url 、标题、以及对应事件进行测试

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

6、连接设备,进行测试简单效果如下

Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件)

六、关键代码

1、WebViewPage

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

// 定义一个 StatefulWidget,用于创建一个包含 WebView 的页面
class WebViewPage extends StatefulWidget {
  // 网页地址,必须传入
  final String url;
  // 页面标题,必须传入
  final String title;
  // 开始加载事件的回调函数,可选
  final Function? onLoadStart;
  // 加载完成事件的回调函数,可选
  final Function? onLoadStop;
  // 加载报错事件的回调函数,可选
  final Function? onLoadError;

  // 构造函数,传入网页地址、标题和可选的回调函数
  WebViewPage({
    required this.url,
    required this.title,
    this.onLoadStart,
    this.onLoadStop,
    this.onLoadError,
  });

  // 创建对应的 State 对象
  @override
  _WebViewPageState createState() => _WebViewPageState();
}

// 定义对应的 State 类
class _WebViewPageState extends State<WebViewPage> {
  // 声明一个 InAppWebViewController 对象,用于控制 WebView
  late InAppWebViewController _webViewController;

  @override
  Widget build(BuildContext context) {
    // 使用 Scaffold 构建页面结构
    return Scaffold(
      // 添加一个带有返回按钮的 AppBar
      appBar: AppBar(
        // 返回按钮
        leading: IconButton(
          icon: Icon(Icons.arrow_back), // 返回按钮图标
          onPressed: () {
            // 点击返回按钮时,返回上一个页面
            Navigator.pop(context);
          },
        ),
        // 标题显示传入的 title 参数
        title: Text(widget.title),
      ),
      // 在 body 中放置一个 InAppWebView
      body: InAppWebView(
        // 设置初始加载的 URL 请求
        initialUrlRequest: URLRequest(url: WebUri(widget.url)),
        // 当 WebView 创建完成后,获取控制器对象
        onWebViewCreated: (InAppWebViewController controller) {
          _webViewController = controller;
        },
        // 当网页开始加载时,触发回调
        onLoadStart: (controller, url) {
          // 如果 onLoadStart 回调函数不为空,则调用它
          if (widget.onLoadStart != null) {
            widget.onLoadStart!(url.toString());
          }
        },
        // 当网页加载完成时,触发回调
        onLoadStop: (controller, url) async {
          // 如果 onLoadStop 回调函数不为空,则调用它
          if (widget.onLoadStop != null) {
            widget.onLoadStop!(url.toString());
          }
        },
        // 当网页加载出错时,触发回调
        onReceivedError: (controller, request, error) {
          // 如果 onLoadError 回调函数不为空,则调用它
          if (widget.onLoadError != null) {
            // 传入请求的 URL、错误类型和错误描述
            widget.onLoadError!(request.url.toString(), error.type, error.description);
          }
        },
      ),
    );
  }
}

代码说明

  1. 类定义

    • WebViewPage 是一个 StatefulWidget,用于创建一个包含 InAppWebView 的页面。

    • 它接收网页地址 (url)、标题 (title) 和三个可选的回调函数 (onLoadStartonLoadStoponLoadError)。

  2. 构造函数

    • 构造函数中使用 required 关键字确保 urltitle 是必须传入的参数。

    • 回调函数是可选的,因此使用了 Function? 类型。

  3. State 类

    • _WebViewPageStateWebViewPage 的状态类,用于管理页面的状态。

    • 它包含一个 late InAppWebViewController _webViewController,用于控制 InAppWebView

  4. Scaffold

    • 使用 Scaffold 构建页面结构,包含一个 AppBar 和一个 body

    • AppBar 中有一个返回按钮,点击返回按钮会调用 Navigator.pop(context),返回上一个页面。

  5. InAppWebView

    • initialUrlRequest:设置初始加载的 URL 请求。

    • onWebViewCreated:当 InAppWebView 创建完成后,获取控制器对象。

    • onLoadStart:当网页开始加载时,触发回调。

    • onLoadStop:当网页加载完成时,触发回调。

    • onReceivedError:当网页加载出错时,触发回调。

  6. 回调函数

    • 如果传入了回调函数(onLoadStartonLoadStoponLoadError),则在对应的事件发生时调用它们。

    • 回调函数的参数包括当前加载的 URL、错误类型和错误描述。

通过这些注释,你可以更清楚地理解代码的结构和功能。

2、main

import 'package:flutter/material.dart';
import 'package:test_flutter_inappwebview/webview_page.dart';

// 主函数,程序的入口点
void main() {
  runApp(MyApp());
}

// 定义一个 StatelessWidget,作为应用的根组件
class MyApp extends StatelessWidget {
  // 构建应用的界面
  @override
  Widget build(BuildContext context) {
    // 返回一个 MaterialApp,它是 Flutter 应用的基础框架
    return MaterialApp(
      title: 'Flutter WebView Example', // 应用的标题
      theme: ThemeData(
        primarySwatch: Colors.blue, // 应用的主题颜色
      ),
      home: HomeScreen(), // 应用的首页组件
    );
  }
}

// 定义首页组件
class HomeScreen extends StatelessWidget {
  // 构建首页的界面
  @override
  Widget build(BuildContext context) {
    // 使用 Scaffold 构建页面结构
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter WebView Example'), // 标题栏的标题
      ),
      body: Center(
        // 在页面中心放置一个按钮
        child: ElevatedButton(
          onPressed: () {
            // 按钮点击事件处理逻辑
            // 跳转到 WebView 页面
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => WebViewPage(
                  // 传入 WebView 页面的参数
                  url: 'https://www.deepseek.com', // 网页地址
                  title: 'Example Website', // 标题
                  onLoadStart: (url) {
                    // 加载开始事件回调
                    print('开始加载: $url'); // 打印加载开始的 URL
                  },
                  onLoadStop: (url) {
                    // 加载完成事件回调
                    print('加载完成: $url'); // 打印加载完成的 URL
                  },
                  onLoadError: (url, code, message) {
                    // 加载报错事件回调
                    print('加载报错: $url, 错误码: $code, 错误信息: $message'); // 打印加载报错信息
                  },
                ),
              ),
            );
          },
          child: Text('Open Web Page'), // 按钮的文本
        ),
      ),
    );
  }
}

代码说明

  1. 主函数 (main)

    • main 是程序的入口点,调用 runApp 方法启动应用。

    • MyApp 作为根组件传递给 runAppMyApp 是整个应用的顶层组件。

  2. MyApp

    • 定义了一个 StatelessWidget,作为应用的根组件。

    • build 方法中返回了一个 MaterialApp,它是 Flutter 应用的基础框架。

    • title:设置应用的标题。

    • theme:设置应用的主题颜色。

    • home:设置应用的首页组件为 HomeScreen

  3. HomeScreen

    • 定义了首页组件。

    • 使用 Scaffold 构建页面结构,包含一个 AppBar 和一个 body

    • AppBar:标题栏,显示应用的标题。

    • body:页面的主体内容,包含一个 ElevatedButton 按钮。

  4. ElevatedButton 按钮

    • 按钮的 onPressed 属性定义了点击按钮时的事件处理逻辑。

    • 使用 Navigator.push 方法跳转到 WebViewPage 页面。

    • MaterialPageRoutebuilder 中创建了一个 WebViewPage 实例,并传入了以下参数:

      • url:网页地址,这里传入了 https://www.deepseek.com

      • title:标题,显示在 WebView 页面的标题栏中。

      • onLoadStart:加载开始事件的回调函数,打印加载开始的 URL。

      • onLoadStop:加载完成事件的回调函数,打印加载完成的 URL。

      • onLoadError:加载报错事件的回调函数,打印加载报错的 URL、错误码和错误信息。

  5. WebViewPage

    • WebViewPage 是一个 StatefulWidget,用于显示一个网页。

    • 它接收 urltitle 和三个回调函数作为参数。

    • WebViewPageState 类中,使用 InAppWebView 加载网页,并处理加载事件。

如何运行

  1. 确保你已经安装了 Flutter 开发环境。

  2. 将上述代码保存到一个 Dart 文件中(例如 main.dart)。

  3. 在项目中添加 flutter_inappwebview 依赖:

    dependencies:
      flutter:
        sdk: flutter
      flutter_inappwebview: ^6.0.0-beta.17 # 请根据实际情况选择合适的版本
  4. 运行项目:

    flutter run

点击首页的按钮后,应用会跳转到一个包含标题栏和 WebView 的页面,加载指定的网页,并在控制台中打印加载事件的相关信息。

平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/u014361280/article/details/146416816

遇见资源网 前端 Flutter 学习之旅 之 flutter 使用 flutter_inappwebview 进行网页内容显示封装(url/标题/开始加载、加载完成、加载失败事件) http://www.ox520.com/157431.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务