You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用中如何关闭WebView并返回上一页面

Flutter应用中如何关闭WebView并返回上一页面

我来帮你搞定这个需求!在Flutter里要实现WebView内的用户操作触发页面关闭返回上一页,核心就是打通网页和Flutter代码的通信,下面我给你两种最常用的实现方案,你可以根据自己的场景选择:

方案一:利用JavaScript通道(推荐,适用于你能控制网页代码的场景)

这个方案通过在Flutter和WebView之间建立一个JavaScript通信通道,让网页里的事件可以主动通知Flutter执行页面关闭操作。

步骤1:配置WebView并建立通信通道

首先确保你已经引入了官方的webview_flutter包(在pubspec.yaml里添加依赖后执行flutter pub get),然后在WebView页面的代码里这样写:

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

class WebViewPage extends StatefulWidget {
  final String targetUrl;
  const WebViewPage({super.key, required this.targetUrl});

  @override
  State<WebViewPage> createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  late WebViewController _webViewController;

  @override
  void initState() {
    super.initState();
    _webViewController = WebViewController()
      // 必须开启JavaScript支持,否则通信通道无法工作
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      // 添加自定义的JavaScript通道,名称要和网页里的对应
      ..addJavaScriptChannel(
        'CloseWebViewChannel',
        onMessageReceived: (JavaScriptMessage message) {
          // 收到网页发来的关闭指令后,返回上一页面
          if (message.message == 'trigger_close') {
            Navigator.of(context).pop();
          }
        },
      )
      // 加载目标网页
      ..loadRequest(Uri.parse(widget.targetUrl));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('网页操作页')),
      body: WebViewWidget(controller: _webViewController),
    );
  }
}

步骤2:在网页中触发关闭指令

在你的网页代码里,当用户点击按钮或者完成指定动作时,调用我们建好的通信通道发送消息。比如网页里的按钮点击事件:

// 假设网页里有一个id为"completeBtn"的按钮
document.getElementById('completeBtn').addEventListener('click', function() {
  // 检查通信通道是否存在,避免报错
  if (window.CloseWebViewChannel) {
    // 向Flutter发送关闭指令
    window.CloseWebViewChannel.postMessage('trigger_close');
  }
});

如果是表单提交完成后触发,就把这段代码放到表单的成功回调里就行。

方案二:拦截特定URL(适用于无法修改网页代码的场景)

如果你没法修改网页的代码(比如加载的是第三方网页),可以通过拦截网页的特定跳转URL来触发关闭操作。我们约定一个专属的URL协议(比如flutter://close-webview),当网页跳转到这个URL时,Flutter就执行页面关闭。

代码示例如下:

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

class WebViewPage extends StatefulWidget {
  final String targetUrl;
  const WebViewPage({super.key, required this.targetUrl});

  @override
  State<WebViewPage> createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  late WebViewController _webViewController;

  @override
  void initState() {
    super.initState();
    _webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onNavigationRequest: (NavigationRequest request) {
            // 拦截约定的关闭URL
            if (request.url.startsWith('flutter://close-webview')) {
              Navigator.of(context).pop();
              // 阻止这个URL的实际跳转
              return NavigationDecision.prevent;
            }
            // 其他URL正常跳转
            return NavigationDecision.navigate;
          },
        ),
      )
      ..loadRequest(Uri.parse(widget.targetUrl));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('第三方网页页')),
      body: WebViewWidget(controller: _webViewController),
    );
  }
}

这种情况下,只要第三方网页里有跳转到flutter://close-webview的操作(比如按钮的href设为这个值,或者JS里执行window.location.href = 'flutter://close-webview'),就能触发Flutter的页面关闭。


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:58:18