Flutter嵌入腾讯X5内核浏览网页插件webview_flutter_x5的使用

Flutter嵌入腾讯X5内核浏览网页插件webview_flutter_x5的使用


简介

webview_flutter_x5 是一个用于 Flutter 的插件,它允许开发者在应用中嵌入 WebView,并支持腾讯 X5 内核。在 Android 平台上,它利用了腾讯 X5 内核来增强网页渲染能力。

功能特点

  • 支持 Android 和 iOS 平台。
  • 提供基于腾讯 X5 内核的高性能 WebView。
  • 支持 JavaScript 操作。
  • 可配置权限请求。

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  webview_flutter_x5: ^latest_version

运行以下命令以更新依赖:

flutter pub get

2. 初始化 X5 内核

在 Flutter 应用启动时,需要初始化 X5 内核。可以通过调用 WebviewFlutterX5.initX5 方法完成初始化。

import 'package:webview_flutter_x5/webview_flutter_x5.dart';

void initX5() async {
  await WebviewFlutterX5.initX5(
    needPermissionCallback: (List<String> permissions) async {
      List<Permission> permissionList = [];
      for (final item in permissions) {
        if (item == 'camera') {
          permissionList.add(Permission.camera);
        } else if (item == 'storage') {
          permissionList.add(Permission.storage);
        }
      }
      if (permissionList.isNotEmpty) {
        Map<Permission, PermissionStatus> statuses = await permissionList.request();
        print('权限状态: $statuses');
      }
    },
  );
}

3. 创建 WebView 页面

创建一个简单的 WebView 页面,加载指定的 URL。

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

class WebviewPage extends StatefulWidget {
  final String url;

  WebviewPage(this.url);

  [@override](/user/override)
  _WebviewPageState createState() => _WebviewPageState();
}

class _WebviewPageState extends State<WebviewPage> {
  final Completer<WebViewController> _completer = Completer<WebViewController>();
  bool loading = true;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化 X5 内核(仅限 Android)
    if (Platform.isAndroid) {
      WebView.platform = SurfaceAndroidWebView();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: [
        WebView(
          initialUrl: widget.url,
          onWebViewCreated: _completer.complete,
          javascriptMode: JavascriptMode.unrestricted,
          onPageStarted: (url) {
            print('页面开始加载: $url');
          },
          onPageFinished: (url) {
            print('页面加载完成: $url');
            setState(() {
              loading = false;
            });
          },
          navigationDelegate: (NavigationRequest request) {
            print('导航请求: ${request.url}');
            return NavigationDecision.navigate;
          },
        ),
        loading ? Center(child: CircularProgressIndicator()) : Container(),
      ],
    );
  }
}

4. 配置 Android 平台

在 Android 项目中,确保 minSdkVersion 至少为 19,并启用 Hybrid Composition。

打开 android/app/build.gradle 文件,修改 minSdkVersion

android {
    defaultConfig {
        minSdkVersion 19
    }
}

main.dart 中启用 Hybrid Composition:

import 'dart:io';

import 'package:webview_flutter_x5/webview_flutter_x5.dart';

class WebViewExample extends StatefulWidget {
  [@override](/user/override)
  WebViewExampleState createState() => WebViewExampleState();
}

class WebViewExampleState extends State<WebViewExample> {
  [@override](/user/override)
  void initState() {
    super.initState();
    // 启用 Hybrid Composition
    if (Platform.isAndroid) {
      WebView.platform = SurfaceAndroidWebView();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return WebView(
      initialUrl: 'https://flutter.dev',
    );
  }
}

5. 运行示例

运行以下代码以查看效果:

import 'dart:async';
import 'dart:io';

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Webview DEMO',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter WebView DEMO'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({this.title = ''});

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化 X5 内核
    WebviewFlutterX5.initX5();
  }

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => WebviewPage('https://www.baidu.com')),
                );
              },
              child: Text('打开百度'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => WebviewPage('https://www.google.com')),
                );
              },
              child: Text('打开谷歌'),
            ),
          ],
        ),
      ),
    );
  }
}

完整示例代码

以下是完整的示例代码,包括初始化、权限请求、WebView 页面等部分。

import 'dart:async';
import 'dart:io';

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Webview DEMO',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter WebView DEMO'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({this.title = ''});

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化 X5 内核
    WebviewFlutterX5.initX5();
  }

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => WebviewPage('https://www.baidu.com')),
                );
              },
              child: Text('打开百度'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => WebviewPage('https://www.google.com')),
                );
              },
              child: Text('打开谷歌'),
            ),
          ],
        ),
      ),
    );
  }
}

class WebviewPage extends StatefulWidget {
  final String url;

  WebviewPage(this.url);

  [@override](/user/override)
  _WebviewPageState createState() => _WebviewPageState();
}

class _WebviewPageState extends State<WebviewPage> {
  final Completer<WebViewController> _completer = Completer<WebViewController>();
  bool loading = true;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化 X5 内核(仅限 Android)
    if (Platform.isAndroid) {
      WebView.platform = SurfaceAndroidWebView();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: [
        WebView(
          initialUrl: widget.url,
          onWebViewCreated: _completer.complete,
          javascriptMode: JavascriptMode.unrestricted,
          onPageStarted: (url) {
            print('页面开始加载: $url');
          },
          onPageFinished: (url) {
            print('页面加载完成: $url');
            setState(() {
              loading = false;
            });
          },
          navigationDelegate: (NavigationRequest request) {
            print('导航请求: ${request.url}');
            return NavigationDecision.navigate;
          },
        ),
        loading ? Center(child: CircularProgressIndicator()) : Container(),
      ],
    );
  }
}

更多关于Flutter嵌入腾讯X5内核浏览网页插件webview_flutter_x5的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter嵌入腾讯X5内核浏览网页插件webview_flutter_x5的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中嵌入腾讯X5内核浏览网页的插件 webview_flutter_x5 可以帮助你在应用中加载网页内容,并且利用腾讯X5内核的优势,如更好的兼容性和性能。以下是使用 webview_flutter_x5 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  webview_flutter_x5: ^1.0.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 webview_flutter_x5 包:

import 'package:webview_flutter_x5/webview_flutter_x5.dart';

3. 使用 WebView

你可以在你的 Flutter 应用中使用 WebView 组件来加载网页。以下是一个简单的示例:

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

class MyWebView extends StatefulWidget {
  [@override](/user/override)
  _MyWebViewState createState() => _MyWebViewState();
}

class _MyWebViewState extends State<MyWebView> {
  late WebViewController _controller;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView with X5'),
      ),
      body: WebView(
        initialUrl: 'https://www.example.com',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;
        },
      ),
    );
  }
}

4. 运行应用

确保你已经配置好了 Flutter 开发环境,然后运行你的应用。你应该能够看到一个加载了指定网页的 WebView。

5. 其他配置

webview_flutter_x5 提供了许多其他配置选项,例如:

  • javascriptMode: 控制是否启用 JavaScript。
  • onPageStarted: 当页面开始加载时触发。
  • onPageFinished: 当页面加载完成时触发。
  • onProgress: 页面加载进度变化时触发。
  • navigationDelegate: 控制是否允许导航到特定 URL。

你可以根据你的需求进行配置。

6. 注意事项

  • AndroidX: 确保你的项目已经迁移到 AndroidX,因为 webview_flutter_x5 依赖于 AndroidX。
  • 权限: 如果你的应用需要访问网络,确保在 AndroidManifest.xml 中添加了网络权限:
<uses-permission android:name="android.permission.INTERNET"/>

7. 处理 WebView 的生命周期

在 Flutter 中,WebView 的生命周期需要手动管理。你可以在 Statedispose 方法中释放 WebView 资源:

[@override](/user/override)
void dispose() {
  _controller.clearCache();
  super.dispose();
}

8. 处理 X5 内核的初始化

腾讯X5内核可能需要一些时间来初始化。你可以通过监听 WebViewonWebViewCreated 回调来处理初始化逻辑。

9. 调试

如果你在开发过程中遇到问题,可以通过 flutter run 命令查看日志输出,或者使用 flutter doctor 检查环境配置。

10. 更多功能

webview_flutter_x5 还支持更多高级功能,如文件上传、自定义 User-Agent、Cookie 管理等。你可以参考插件的官方文档或源码来了解更多细节。

示例代码

以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WebView X5 Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyWebView(),
    );
  }
}

class MyWebView extends StatefulWidget {
  [@override](/user/override)
  _MyWebViewState createState() => _MyWebViewState();
}

class _MyWebViewState extends State<MyWebView> {
  late WebViewController _controller;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView with X5'),
      ),
      body: WebView(
        initialUrl: 'https://www.example.com',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;
        },
        onPageStarted: (String url) {
          print('Page started loading: $url');
        },
        onPageFinished: (String url) {
          print('Page finished loading: $url');
        },
        navigationDelegate: (NavigationRequest request) {
          if (request.url.startsWith('https://www.example.com')) {
            return NavigationDecision.navigate;
          }
          return NavigationDecision.prevent;
        },
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _controller.clearCache();
    super.dispose();
  }
}
回到顶部