You need to enable JavaScript to run this app. Flutter中WebView内返回按钮不生效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中WebView内返回按钮不生效问题求助

问题根因排查
    1. WebViewController 赋值逻辑错误
      你当前在onWebViewCreated回调中先监听_controllerCompleter的完成事件再执行赋值,再调用complete方法,会存在时间差,首次触发返回逻辑时_controller还未完成初始化,抛出异常后直接走默认关闭页面的逻辑。
    1. 页面外层嵌套了多余的MaterialApp
      Resources作为路由栈中的子页面,不需要单独套MaterialApp,独立的导航栈会导致WillPopScope的拦截逻辑无法正常作用于父路由的返回操作。
    1. 未处理AppBar默认返回按钮的点击事件(可选优化)
      WillPopScope默认只监听系统返回键,若需要AppBar左上角的返回按钮也触发WebView回退逻辑,需要手动修改AppBar的leading属性。
修复后的完整代码
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class Resources extends StatefulWidget {
  @override
  _ResourcesState createState() => _ResourcesState();
}

class _ResourcesState extends State<Resources> {
  late WebViewController _controller;

  Future<bool> _handlePop(BuildContext context) async {
    if (await _controller.canGoBack()) {
      _controller.goBack();
      return false;
    }
    return true;
  }

  @override
  void initState() {
    super.initState();
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  @override
  Widget build(BuildContext context) {
    // 去掉多余的MaterialApp,直接返回Scaffold外层包WillPopScope
    return SafeArea(
      child: WillPopScope(
        onWillPop: () => _handlePop(context),
        child: Scaffold(
          appBar: AppBar(
            // 可选:手动配置返回按钮触发拦截逻辑
            leading: IconButton(
              icon: const Icon(Icons.arrow_back),
              onPressed: () async {
                if (await _controller.canGoBack()) {
                  _controller.goBack();
                } else {
                  Navigator.pop(context);
                }
              },
            ),
          ),
          body: WebView(
            gestureNavigationEnabled: true,
            initialUrl: 'https://www.edhitch.com/login.html',
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) {
              // 直接给_controller赋值,不需要绕completer做无用的延迟赋值
              _controller = webViewController;
            },
          ),
        ),
      ),
    );
  }
}
验证步骤
  1. 进入WebView页面后点击任意链接跳转二级页面
  2. 点击系统返回键,会先回退到WebView的上一级页面,直到WebView没有历史栈时才会关闭当前页面
  3. 若加了AppBar leading的自定义逻辑,点击左上角返回按钮也会触发相同逻辑

内容的提问来源于stack exchange,提问作者Harsh Kumar Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 06:09:02