Flutter WebView注入与交互插件webview_inject的使用

Flutter WebView注入与交互插件webview_inject的使用

Features

List what your package can do. Maybe include images, gifs, or videos.

此插件允许在Flutter应用中通过WebView加载网页,并支持JavaScript注入和与网页进行双向通信。


Getting started

List prerequisites and provide or point to information on how to start using the package.

前置条件:

  • 确保已安装Flutter SDK。
  • 配置好Android或iOS开发环境。

安装插件:

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

dependencies:
  webview_inject: ^版本号

执行以下命令以更新依赖项:

flutter pub get

Usage

Include short and useful examples for package users. Add longer examples to /example folder.

示例代码:

1. 初始化WebView并注入JavaScript代码

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: WebViewInjectExample(),
    );
  }
}

class WebViewInjectExample extends StatefulWidget {
  @override
  _WebViewInjectExampleState createState() => _WebViewInjectExampleState();
}

class _WebViewInjectExampleState extends State<WebViewInjectExample> {
  late WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView Inject Example'),
      ),
      body: WebViewInject(
        onWebViewCreated: (WebViewController controller) {
          _controller = controller;
        },
        javascriptMode: JavascriptMode.unrestricted,
        initialUrl: 'https://example.com',
        onPageFinished: (String url) async {
          // 页面加载完成后注入JavaScript代码
          await _controller.evaluateJavascript("""
            alert('Hello from Flutter!');
            document.body.style.backgroundColor = 'lightblue';
          """);
        },
      ),
    );
  }
}

2. 从WebView接收消息并响应

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

class WebViewMessageExample extends StatefulWidget {
  @override
  _WebViewMessageExampleState createState() => _WebViewMessageExampleState();
}

class _WebViewMessageExampleState extends State<WebViewMessageExample> {
  late WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView Message Example'),
      ),
      body: WebViewInject(
        onWebViewCreated: (WebViewController controller) {
          _controller = controller;
        },
        javascriptMode: JavascriptMode.unrestricted,
        initialUrl: 'https://example.com',
        onPageFinished: (String url) async {
          // 注入用于监听消息的脚本
          await _controller.evaluateJavascript("""
            window.flutter_injected = true;
            window.addEventListener('message', function(event) {
              if (event.data.type === 'fromFlutter') {
                alert('Received message from Flutter: ' + event.data.message);
              }
            });
          """);

          // 向WebView发送消息
          await _controller.postMessage({
            "type": "fromFlutter",
            "message": "Hello from Flutter!",
          });
        },
      ),
    );
  }
}

Additional information

Testing

测试命令:

flutter pub publish --dry-run
flutter pub publish

更多关于Flutter WebView注入与交互插件webview_inject的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter WebView注入与交互插件webview_inject的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,webview_flutter 是一个非常流行的插件,用于在应用程序中嵌入WebView。然而,如果你需要在WebView中注入JavaScript代码或与WebView进行交互,webview_flutter 本身提供了一些基本的功能,但如果你需要更高级的功能,可能需要借助其他插件或自定义实现。

webview_inject 是一个用于在WebView中注入JavaScript代码的插件,它可以帮助你实现与WebView的交互。以下是使用 webview_inject 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  webview_inject: ^0.0.1  # 请检查最新版本

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

2. 导入插件

在你的Dart文件中导入 webview_inject 插件:

import 'package:webview_inject/webview_inject.dart';

3. 创建WebView并注入JavaScript

你可以使用 WebViewInject 类来创建WebView并注入JavaScript代码。以下是一个简单的示例:

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

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

class _MyWebViewState extends State<MyWebView> {
  WebViewInjectController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = WebViewInjectController();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView Inject Example'),
      ),
      body: WebViewInject(
        initialUrl: 'https://example.com',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewInjectController controller) {
          _controller = controller;
        },
        onPageFinished: (String url) {
          _controller.injectScript('alert("Page loaded!");');
        },
      ),
    );
  }
}

4. 与WebView交互

你可以通过 WebViewInjectController 来与WebView进行交互。例如,你可以在页面加载完成后注入JavaScript代码,或者从JavaScript中获取返回值。

_controller.injectScript('''
  document.body.style.backgroundColor = "red";
''');

5. 处理JavaScript返回值

如果你需要从JavaScript中获取返回值,可以使用 evaluateJavascript 方法:

_controller.evaluateJavascript('document.title').then((result) {
  print('Page title: $result');
});

6. 处理WebView事件

你还可以处理WebView的各种事件,例如页面加载、错误等:

WebViewInject(
  initialUrl: 'https://example.com',
  javascriptMode: JavascriptMode.unrestricted,
  onWebViewCreated: (WebViewInjectController controller) {
    _controller = controller;
  },
  onPageStarted: (String url) {
    print('Page started loading: $url');
  },
  onPageFinished: (String url) {
    print('Page finished loading: $url');
  },
  onWebResourceError: (WebResourceError error) {
    print('Error: ${error.description}');
  },
);

7. 注意事项

  • webview_inject 插件可能不是官方维护的插件,因此在使用时需要注意其稳定性和兼容性。
  • 如果你需要更复杂的WebView交互,可能需要考虑使用 flutter_inappwebview 插件,它提供了更多的功能和更好的支持。

8. 使用 flutter_inappwebview 作为替代

如果你发现 webview_inject 无法满足你的需求,可以考虑使用 flutter_inappwebview 插件。它提供了更丰富的API,支持更复杂的WebView操作。

dependencies:
  flutter_inappwebview: ^5.0.0  # 请检查最新版本
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

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

class _MyWebViewState extends State<MyWebView> {
  InAppWebViewController _webViewController;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('InAppWebView Example'),
      ),
      body: InAppWebView(
        initialUrlRequest: URLRequest(url: Uri.parse('https://example.com')),
        onWebViewCreated: (InAppWebViewController controller) {
          _webViewController = controller;
        },
        onLoadStop: (InAppWebViewController controller, Uri url) async {
          await controller.evaluateJavascript(source: 'alert("Page loaded!");');
        },
      ),
    );
  }
}
回到顶部