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

Flutter WebView:实现AppBar按钮返回上页及无历史时返回应用

解决Flutter WebView页面返回按钮功能问题

你之前的代码失效核心原因是:WebViewController是在build方法里临时创建的,没有作为页面类的成员变量保存,导致你写的_exitApp方法里调用的controller和WebView实际使用的不是同一个实例,自然没法控制WebView返回。

按下面步骤修改就能实现需求:

  1. 在页面类中声明成员变量,用来持有WebViewController实例
  2. 在initState方法里初始化控制器,避免每次build重建
  3. 修改AppBar按钮的点击逻辑,调用正确的返回处理方法
  4. 处理返回逻辑:WebView有历史就返回上一页,没有就退出当前WebView页面回到应用

完整代码示例:

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

class WebViewPage extends StatefulWidget {
  const WebViewPage({super.key});

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

class _WebViewPageState extends State<WebViewPage> {
  // 声明成员变量持有控制器
  late WebViewController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化控制器
    _controller = WebViewController()
      ..enableZoom(false)
      ..setNavigationDelegate(NavigationDelegate(
        onNavigationRequest: (request) {
          if (request.url ==
              "https://en.wikipedia.org/wiki/Eastern_Mediterranean_University") {
            ScaffoldMessenger.of(context).showSnackBar(
                const SnackBar(content: Text("emu uni")));
            return NavigationDecision.prevent;
          }
          return NavigationDecision.navigate;
        },
      ))
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(
        Uri.parse('https://google.com/'),
      );
  }

  // 处理返回逻辑
  Future<void> _handleBackPress() async {
    if (await _controller.canGoBack()) {
      _controller.goBack();
    } else {
      // 无历史页面时,导航回应用之前的页面
      Navigator.pop(context);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Web view'),
        actions: [
          IconButton(
            onPressed: _handleBackPress, // 绑定处理方法
            icon: Icon(
              Icons.arrow_back,
              color: Theme.of(context).primaryColorDark,
            ),
          ),
        ],
      ),
      body: WebViewWidget(controller: _controller), // 使用成员变量的控制器
    );
  }
}

关键说明:

  • 把WebViewController升级为页面的成员变量,确保整个页面生命周期内使用同一个实例
  • 在initState初始化控制器,避免build方法重复创建导致的状态丢失
  • _handleBackPress方法里,先判断WebView是否有历史页面,有则调用goBack(),没有则用Navigator.pop(context)退出当前WebView页面回到应用

内容的提问来源于stack exchange,提问作者Yousef Hatim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:53:12