webview_flutter的使用

步骤

1.配置依赖。根目录下运行如下命令:

flutter pub add webview_flutter

2.所需页面导入:

import ‘package:webview_flutter/webview_flutter.dart’;

3.初始化WebViewController


  void initState() {
    super.initState();
    _initWebViewController();
  }

  void _initWebViewController() {
    controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x00000000))
      ..setNavigationDelegate(
        NavigationDelegate(
          onProgress: (int progress) {
		// Update loading bar.
          },
          onPageStarted: (String url) {},
          onPageFinished: (String url) {
		//页面加载完成后才能执行js
            _handleBackForbid();
          },
          onWebResourceError: (WebResourceError error) {},
          onNavigationRequest: (NavigationRequest request) {
            return NavigationDecision.navigate;
          },
        ),
      )
      ..loadRequest(Uri.parse('https://www.geekailab.com'));
  }

示例代码

import 'package:flutter/material.dart';
// 导入 webview_flutter 包,用于在 Flutter 应用中嵌入 WebView 来显示网页内容
import 'package:webview_flutter/webview_flutter.dart';

// 定义一个名为 RelfreshPage 的有状态组件,用于展示一个包含 WebView 的页面
class RelfreshPage extends StatefulWidget {
  // 构造函数,Key? key 是可选参数,用于在组件树中唯一标识该组件
  const RelfreshPage({Key? key}) : super(key: key);

  // 创建该组件对应的状态类实例
  
  State<RelfreshPage> createState() => _RelfreshPageState();
}

// 定义 RelfreshPage 组件对应的状态类
class _RelfreshPageState extends State<RelfreshPage> {
  // 定义一个 WebViewController 类型的变量 controller,用于控制 WebView 的行为
  // late 关键字表示该变量会在使用前被初始化
  late WebViewController controller;

  // 组件状态初始化方法,在组件创建时调用
  
  void initState() {
    // 调用父类的 initState 方法,确保父类的初始化逻辑正常执行
    super.initState();
    // 调用自定义的初始化 WebView 控制器的方法
    _initWebViewController();
  }

  // 自定义方法,用于初始化 WebView 控制器
  void _initWebViewController() {
    // 创建一个 WebViewController 实例,并对其进行一系列配置
    controller = WebViewController()
      // 设置 JavaScript 模式为 unrestricted,表示允许在 WebView 中无限制地执行 JavaScript 代码
     ..setJavaScriptMode(JavaScriptMode.unrestricted)
      // 设置 WebView 的背景颜色为透明
     ..setBackgroundColor(const Color(0x00000000))
      // 设置导航委托,用于监听 WebView 的各种导航事件
     ..setNavigationDelegate(
        NavigationDelegate(
          // 当页面加载进度发生变化时调用该回调函数,参数 progress 表示加载进度百分比
          onProgress: (int progress) {
            // 这里可以更新加载进度条,但当前代码中未实现具体逻辑
            // Update loading bar.
          },
          // 当页面开始加载时调用该回调函数,参数 url 表示要加载的页面的 URL
          onPageStarted: (String url) {},
          // 当页面加载完成时调用该回调函数,参数 url 表示已加载完成的页面的 URL
          onPageFinished: (String url) {
            // 页面加载完成后才能执行 js,当前代码中注释掉了具体执行逻辑
            // _handleBackForbid();
          },
          // 当 Web 资源加载出错时调用该回调函数,参数 error 包含错误信息
          onWebResourceError: (WebResourceError error) {},
          // 当有导航请求时调用该回调函数,参数 request 包含导航请求的信息
          // 根据具体情况返回 NavigationDecision.navigate 或 NavigationDecision.prevent 来决定是否允许导航
          onNavigationRequest: (NavigationRequest request) {
            // 允许所有导航请求
            return NavigationDecision.navigate;
          },
        ),
      )
      // 加载指定 URL 的网页
     ..loadRequest(Uri.parse('https://www.geekailab.com'));
  }

  // 构建组件的 UI 界面
  
  Widget build(BuildContext context) {
    // 返回一个 Scaffold 组件,它是 Flutter 中常用的页面布局组件
    return Scaffold(
      // 设置页面的顶部导航栏,显示标题为 'Flutter Simple Example'
      appBar: AppBar(title: const Text('Flutter Simple Example')),
      // 设置页面的主体内容,使用 WebViewWidget 组件来显示 WebView
      // 将之前初始化好的 controller 传递给 WebViewWidget,用于控制 WebView 的行为
      body: WebViewWidget(controller: controller),
    );
  }
}

插件地址:
https://pub.dev/packages/webview_flutter

### 使用 WebView_flutter 与 CEF(Chromium Embedded Framework)结合的解决方案 目前,`webview_flutter` 是 Flutter 官方提供的用于嵌入 Web 视图的插件,主要用于移动平台(Android 和 iOS)。然而,对于桌面应用程序(如 Windows、macOS 和 Linux),官方的 `webview_flutter` 插件并不直接支持 Chromium Embedded Framework (CEF) 的集成[^1]。 #### 关于 CEF 的桌面支持 CEF 是一个开源框架,允许开发者将 Chromium 浏览器嵌入到自己的应用程序中。对于桌面端 Flutter 应用程序,可以使用第三方库或自定义实现来完成这一目标。例如,`webview_cef` 是一个基于 CEF 的项目,旨在为 Flutter 桌面应用程序提供更强大的 WebView 功能[^2]。 以下是结合 `webview_flutter` 和 CEF 的可能解决方案: #### 方法一:通过自定义通道(Method Channel)集成 CEF 在桌面端 Flutter 应用程序中,可以通过自定义通道调用原生代码来实现 CEF 的功能。具体步骤如下: 1. 创建一个原生模块以初始化和管理 CEF 实例。 2. 在 Flutter 中通过 Method Channel 调用该模块的方法,传递 URL 或其他配置参数。 3. 将 CEF 渲染的内容嵌入到 Flutter 界面中。 以下是一个简单的示例代码,展示如何通过 Method Channel 调用原生代码: ```dart import 'package:flutter/services.dart'; class CefWebView { static const platform = MethodChannel('cef_webview'); static Future<void> loadUrl(String url) async { try { await platform.invokeMethod('loadUrl', {'url': url}); } on PlatformException catch (e) { print("Failed to load URL: ${e.message}"); } } } ``` #### 方法二:使用 `webview_cef` 插件 `webview_cef` 是一个专门为 Flutter 桌面应用程序设计的插件,它利用了 CEF 的强大功能。虽然该项目仍在开发中,但已经可以满足大多数桌面 WebView 的需求[^2]。 安装和使用方法如下: 1. 在 `pubspec.yaml` 文件中添加依赖项: ```yaml dependencies: webview_cef: ^0.0.1 ``` 2. 导入并使用插件: ```dart import 'package:webview_cef/webview_cef.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('CEF WebView Example')), body: CefWebView( url: 'https://www.example.com', ), ), ); } } ``` #### 注意事项 - `webview_cef` 插件目前仍处于开发阶段,可能存在一些限制或未解决的问题。 - 如果需要更高的定制化程度,建议直接使用 CEF 的原生 API,并通过 Dart FFI 或 Method Channel 进行桥接。 #### 总结 在 Flutter 应用程序中结合使用 `webview_flutter` 和 CEF,可以通过自定义通道或第三方插件(如 `webview_cef`)实现。具体选择取决于项目的需求和技术栈的复杂性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值