Flutter网页视图插件webviewx的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter网页视图插件webviewx的使用

注意:webviewx插件已经被归档,不再维护。以下内容基于该插件的历史版本进行介绍。

项目信息

webviewx

  • Pub Package
  • 注意:此插件已被归档且不再维护。官方建议寻找其他替代方案。

快速开始

基本用法

  1. 创建一个WebViewXController

    在你的状态化组件中定义控制器:

    late WebViewXController webviewController;
    
  2. 在构建方法中添加WebViewX组件

    设置onWebViewCreated回调以获取初始化后的控制器:

    WebViewX(
        initialContent: '<h2>Hello, world!</h2>',
        initialSourceType: SourceType.HTML,
        onWebViewCreated: (controller) => webviewController = controller,
        // ... 其他选项
    );
    
  3. 与控制器交互

    可以通过控制器加载网页、返回上一页等操作:

    webviewController.loadContent(
        'https://flutter.dev',
        SourceType.url,
    );
    webviewController.goBack();
    webviewController.goForward();
    

重要提示

如果你需要在WebView上方添加其他小部件(例如,在Stack小部件内),你必须将这些小部件包装在一个WebViewAware小部件中。这在移动设备上不起作用,但在Web端它允许顶部的小部件拦截手势。否则,这些小部件可能无法点击,或者iframe会意外刷新/重新加载(这是一个已知问题)。

特性

小部件属性

属性 描述
initialContent 初始WebView内容
initialSourceType 初始WebView内容类型 (url, urlBypasshtml)
userAgent 用户代理
width 小部件宽度
height 小部件高度
onWebViewCreated 当WebView初始化时执行的回调
jsContent 一组嵌入式JavaScript内容
dartCallBacks 一组从JavaScript调用的Dart回调函数
ignoreAllGestures 是否忽略所有手势
javascriptMode 是否允许执行JavaScript
initialMediaPlaybackPolicy 初始化时是否允许媒体自动播放
onPageStarted 页面开始加载时执行的回调
onPageFinished 页面加载完成时执行的回调
navigationDelegate 用户点击WebView中的链接时执行的回调
onWebResourceError 加载资源出错时执行的回调
webSpecificParams Web端特定参数
mobileSpecificParams 移动端特定参数

控制器属性

功能 使用方法
加载允许iframe嵌入的URL webviewController.loadContent(URL, SourceType.URL)
加载不允许iframe嵌入的URL webviewController.loadContent(URL, SourceType.URL_BYPASS)
加载不允许iframe嵌入的URL,并带有请求头 webviewController.loadContent(URL, SourceType.URL_BYPASS, headers: {'x-something': 'value'})
加载HTML字符串 webviewController.loadContent(HTML, SourceType.HTML)
加载来自assets的HTML webviewController.loadContent(HTML, SourceType.HTML, fromAssets: true)
检查是否可以返回历史记录 webviewController.canGoBack()
返回历史记录 webviewController.goBack()
检查是否可以前进历史记录 webviewController.canGoForward()
前进历史记录 webviewController.goForward()
重新加载当前内容 webviewController.reload()
检查是否忽略所有手势 webviewController.ignoringAllGestures
设置是否忽略所有手势 webviewController.setIgnoreAllGestures(value)
执行原始JavaScript代码 webviewController.evalRawJavascript(JS)
在全局上下文中执行原始JavaScript代码 webviewController.evalRawJavascript(JS, inGlobalContext: true)
调用JavaScript方法 webviewController.callJsMethod(METHOD_NAME, PARAMS_LIST)
获取WebView的内容 webviewController.getContent()
获取X轴滚动位置 webviewController.getScrollX()
获取Y轴滚动位置 webviewController.getScrollY()
在X轴和Y轴上分别滚动指定距离 webviewController.scrollBy(int x, int y)
滚动到指定位置 webviewController.scrollTo(int x, int y)
获取页面标题 webviewController.getTitle()
清除缓存 webviewController.clearCache()

示例代码

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WebViewX Example App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const WebViewXPage(),
    );
  }
}

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

  @override
  _WebViewXPageState createState() => _WebViewXPageState();
}

class _WebViewXPageState extends State<WebViewXPage> {
  late WebViewXController webviewController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('WebViewX Demo'),
      ),
      body: WebViewX(
        initialContent: '<h2>Hello, world!</h2>',
        initialSourceType: SourceType.HTML,
        onWebViewCreated: (controller) => webviewController = controller,
        width: double.infinity,
        height: double.infinity,
        onPageFinished: (src) {
          print('Page finished loading $src');
        },
        onWebResourceError: (error) {
          print('Error loading resource: ${error.description}');
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          if (await webviewController.canGoBack()) {
            webviewController.goBack();
          } else {
            webviewController.loadContent(
              'https://flutter.dev',
              SourceType.url,
            );
          }
        },
        child: const Icon(Icons.navigate_before),
      ),
    );
  }
}

以上代码展示了如何创建一个简单的Flutter应用程序,其中包含一个WebViewX组件用于加载HTML内容或URL,并提供了基本的导航控制功能。


更多关于Flutter网页视图插件webviewx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网页视图插件webviewx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter项目中使用webviewx插件的示例。webviewx是一个用于在Flutter应用中嵌入WebView的插件。以下是如何在Flutter项目中使用webviewx的详细步骤和代码示例。

步骤 1: 添加依赖

首先,你需要在pubspec.yaml文件中添加webviewx的依赖:

dependencies:
  flutter:
    sdk: flutter
  webviewx: ^latest_version  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

步骤 2: 配置Android权限

如果你需要在Android设备上加载本地文件或访问网络资源,你可能需要在AndroidManifest.xml中添加一些权限。以下是一个基本的配置示例:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <application
        ... >
        ...
    </application>

    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

步骤 3: 使用WebViewX

接下来,你可以在你的Flutter代码中使用WebViewX。以下是一个简单的示例,展示如何在Flutter应用中嵌入一个WebView来加载一个网页。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('WebViewX Example'),
        ),
        body: WebViewX(
          initialUrl: 'https://www.example.com',  // 替换为你想要加载的URL
          initialOptions: WebViewXOptions(
            clearCache: false,
            javaScriptEnabled: true,
            useHybridComposition: true,
          ),
          onWebViewCreated: (controller) {
            // WebView创建后的回调,你可以在这里保存controller以便后续使用
            print('WebView created!');
          },
          onLoadStart: (url) {
            // 加载开始时回调
            print('Loading started: $url');
          },
          onLoadStop: (url) {
            // 加载完成时回调
            print('Loading stopped: $url');
          },
          onError: (error) {
            // 加载错误时回调
            print('Error: $error');
          },
        ),
      ),
    );
  }
}

注意事项

  1. 权限管理:如果你的应用需要访问特定的资源(如文件),请确保在AndroidManifest.xmlInfo.plist(对于iOS)中正确配置了必要的权限。
  2. 版本兼容性:确保你使用的webviewx版本与你的Flutter SDK版本兼容。
  3. 错误处理:在生产环境中,务必添加适当的错误处理逻辑,以处理WebView加载失败或其他潜在问题。

通过上述步骤和代码示例,你应该能够在Flutter应用中成功集成并使用webviewx插件来显示网页内容。

回到顶部