Flutter内嵌网页视图与页面调用插件flutter_inappwebview_pagecall的使用

在Flutter开发中,内嵌网页视图是一个非常常见的需求。flutter_inappwebview 插件提供了强大的功能来实现这一需求,并且 flutter_inappwebview_pagecall 插件进一步增强了与网页之间的交互能力。本文将通过一个完整的示例代码展示如何在Flutter应用中使用这两个插件。

示例代码说明

我们将构建一个简单的Flutter应用,其中包含一个内嵌的网页视图,并演示如何通过插件与网页进行交互。

依赖项

首先,在 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_inappwebview: ^6.0.0
  flutter_inappwebview_pagecall: ^1.0.0

然后运行 flutter pub get 来安装这些依赖。

主代码结构

我们将在 lib/main.dart 中编写主逻辑。

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: InAppWebViewPage(),
    );
  }
}

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

class _InAppWebViewPageState extends State<InAppWebViewPage> {
  late InAppWebViewController _webViewController;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('内嵌网页视图'),
      ),
      body: InAppWebView(
        initialUrlRequest: URLRequest(
          url: Uri.parse("https://example.com"),
        ),
        onWebViewCreated: (controller) {
          _webViewController = controller;
        },
        onLoadStop: (controller, url) {
          print("页面加载完成: $url");
        },
        onPageFinished: (controller, url) {
          print("页面渲染完成: $url");
        },
      ),
    );
  }
}

页面调用插件的使用

接下来,我们将展示如何使用 flutter_inappwebview_pagecall 插件来实现Flutter与网页之间的通信。

初始化插件

_InAppWebViewPageState 类中初始化插件:

late PageCallController _pageCallController;

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

注册事件监听器

onWebViewCreated 方法中注册事件监听器:

onWebViewCreated: (controller) {
  _webViewController = controller;
  _pageCallController.registerEventListener(_webViewController);
},

发送消息到网页

在需要发送消息的地方调用以下方法:

_pageCallController.sendMessageToWebview(
  _webViewController,
  message: '{"type": "customEvent", "data": "Hello from Flutter"}',
);

接收网页发送的消息

在网页端通过 JavaScript 调用 Pagecall 对象发送消息后,可以在 Flutter 端接收并处理:

_pageCallController.addMessageListener((message) {
  print("收到网页消息: $message");
});

完整示例代码

以下是完整的示例代码:

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: InAppWebViewPage(),
    );
  }
}

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

class _InAppWebViewPageState extends State<InAppWebViewPage> {
  late InAppWebViewController _webViewController;
  late PageCallController _pageCallController;

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('内嵌网页视图'),
      ),
      body: InAppWebView(
        initialUrlRequest: URLRequest(
          url: Uri.parse("https://example.com"),
        ),
        onWebViewCreated: (controller) {
          _webViewController = controller;
          _pageCallController.registerEventListener(_webViewController);
        },
        onLoadStop: (controller, url) {
          print("页面加载完成: $url");
        },
        onPageFinished: (controller, url) {
          print("页面渲染完成: $url");
        },
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _pageCallController.unregisterEventListener(_webViewController);
    super.dispose();
  }
}

更多关于Flutter内嵌网页视图与页面调用插件flutter_inappwebview_pagecall的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在Flutter中,如果你想在应用中嵌入网页视图,并且需要与网页进行交互(例如调用JavaScript函数或从网页接收回调),你可以使用 flutter_inappwebview 插件。flutter_inappwebview 是一个功能强大的插件,提供了比 Flutter 自带的 WebView 更多的功能和灵活性。

1. 安装 flutter_inappwebview 插件

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

dependencies:
  flutter:
    sdk: flutter
  flutter_inappwebview: ^5.7.2+3

然后运行 flutter pub get 来安装插件。

2. 使用 flutter_inappwebview 嵌入网页视图

以下是一个简单的示例,展示如何在 Flutter 应用中嵌入一个网页视图:

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

class WebViewExample extends StatefulWidget {
  @override
  _WebViewExampleState createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<WebViewExample> {
  InAppWebViewController? webViewController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter InAppWebView Example'),
      ),
      body: InAppWebView(
        initialUrlRequest: URLRequest(url: Uri.parse('https://www.example.com')),
        onWebViewCreated: (InAppWebViewController controller) {
          webViewController = controller;
        },
        onLoadStart: (InAppWebViewController controller, Uri? url) {
          print('Page started loading: $url');
        },
        onLoadStop: (InAppWebViewController controller, Uri? url) {
          print('Page finished loading: $url');
        },
        onConsoleMessage: (InAppWebViewController controller, ConsoleMessage consoleMessage) {
          print('Console Message: ${consoleMessage.message}');
        },
      ),
    );
  }
}

3. 与网页进行交互

你可以使用 webViewController 来与网页进行交互。例如,调用 JavaScript 函数或从网页接收回调。

调用 JavaScript 函数

webViewController?.evaluateJavascript(source: "yourJavaScriptFunction()");

从网页接收回调

你可以通过 javascriptHandler 来注册一个 JavaScript 处理程序,以便从网页接收回调。

InAppWebView(
  initialUrlRequest: URLRequest(url: Uri.parse('https://www.example.com')),
  onWebViewCreated: (InAppWebViewController controller) {
    webViewController = controller;
    controller.addJavaScriptHandler(
      handlerName: 'myHandler',
      callback: (args) {
        print('Received from JavaScript: $args');
      },
    );
  },
);

在网页中,你可以通过以下方式调用这个处理程序:

window.flutter_inappwebview.callHandler('myHandler', 'Hello from JavaScript!');

4. 使用 flutter_inappwebview_pagecall 插件

flutter_inappwebview_pagecall 是一个基于 flutter_inappwebview 的插件,专门用于处理页面调用和回调。它提供了一种更简洁的方式来处理 Flutter 与网页之间的通信。

安装 flutter_inappwebview_pagecall

pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_inappwebview_pagecall: ^1.0.0

然后运行 flutter pub get 来安装插件。

使用 flutter_inappwebview_pagecall

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

class PageCallExample extends StatefulWidget {
  @override
  _PageCallExampleState createState() => _PageCallExampleState();
}

class _PageCallExampleState extends State<PageCallExample> {
  PageCallController? pageCallController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter InAppWebView PageCall Example'),
      ),
      body: PageCallWebView(
        initialUrl: 'https://www.example.com',
        onPageCallControllerCreated: (controller) {
          pageCallController = controller;
          controller.addHandler('myHandler', (args) {
            print('Received from JavaScript: $args');
          });
        },
      ),
    );
  }
}

在网页中,你可以通过以下方式调用这个处理程序:

window.PageCall.callHandler('myHandler', 'Hello from JavaScript!');
回到顶部