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

Flutter中WillPopScope失效:WebView返回逻辑未执行if-else分支

解决WebView页面返回键不触发后续逻辑的问题

问题分析

核心问题是_webViewController可能在onWillPop回调触发时还未完成初始化,或者canGoBack()调用抛出异常,导致代码无法进入后续分支。另外,late修饰的变量未初始化就访问会直接抛出异常,阻断代码执行。

修复方案

方案1:确保控制器初始化完成并捕获异常

修改控制器为可空类型,添加初始化判断和异常捕获,避免流程中断:

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

class WebViewScreen extends StatefulWidget {
  const WebViewScreen({Key? key}) : super(key: key);

  @override
  State<WebViewScreen> createState() => _WebViewScreenState();
}

class _WebViewScreenState extends State<WebViewScreen> {
  WebViewController? _webViewController; // 改为可空类型,规避late未初始化风险

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        print("onWillPop: Checking if WebView can go back...");
        // 先判断控制器是否已初始化
        if (_webViewController == null) {
          print("onWillPop: WebView controller not initialized yet.");
          return true; // 控制器未就绪时直接退出页面
        }
        // 捕获canGoBack可能的异步异常
        try {
          bool canGoBack = await _webViewController!.canGoBack();
          if (canGoBack) {
            print("onWillPop: WebView can go back, going back.");
            _webViewController!.goBack();
            return false; 
          } else {
            print("onWillPop: WebView can't go back, closing page.");
            return true;
          }
        } catch (e) {
          print("onWillPop: Error checking canGoBack: $e");
          return true; // 异常时默认退出页面
        }
      },
      child: Scaffold(
        body: WebView(
          initialUrl: "https://aptibapa.site",
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController controller) {
            _webViewController = controller;
            print("WebView controller initialized.");
          },
        ),
      ),
    );
  }
}

方案2:结合当前URL双重判断(可选)

如果canGoBack()仍有异常,可以结合当前URL是否为初始地址辅助判断:

onWillPop: () async {
  print("onWillPop: Checking if WebView can go back...");
  if (_webViewController == null) return true;
  
  try {
    bool canGoBack = await _webViewController!.canGoBack();
    String? currentUrl = await _webViewController!.currentUrl();
    // 双重校验:既能返回且当前地址不是初始URL
    if (canGoBack && currentUrl != "https://aptibapa.site") {
      _webViewController!.goBack();
      return false;
    } else {
      return true;
    }
  } catch (e) {
    print("onWillPop error: $e");
    return true;
  }
}

关键改动说明

  • 将late WebViewController改为可空类型,避免未初始化访问导致的崩溃
  • 添加控制器非空判断,确保回调执行时控制器已完成初始化
  • 用try-catch包裹异步调用,捕获异常防止流程中断
  • 补充日志输出,方便追踪执行流程

内容的提问来源于stack exchange,提问作者kim gong yoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:29:53