Flutter中WebView内返回按钮不生效问题求助
问题根因排查
- WebViewController 赋值逻辑错误
你当前在onWebViewCreated回调中先监听_controllerCompleter的完成事件再执行赋值,再调用complete方法,会存在时间差,首次触发返回逻辑时_controller还未完成初始化,抛出异常后直接走默认关闭页面的逻辑。
- WebViewController 赋值逻辑错误
- 页面外层嵌套了多余的
MaterialAppResources作为路由栈中的子页面,不需要单独套MaterialApp,独立的导航栈会导致WillPopScope的拦截逻辑无法正常作用于父路由的返回操作。
- 页面外层嵌套了多余的
- 未处理AppBar默认返回按钮的点击事件(可选优化)
WillPopScope默认只监听系统返回键,若需要AppBar左上角的返回按钮也触发WebView回退逻辑,需要手动修改AppBar的leading属性。
- 未处理AppBar默认返回按钮的点击事件(可选优化)
修复后的完整代码
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; }, ), ), ), ); } }
验证步骤
- 进入WebView页面后点击任意链接跳转二级页面
- 点击系统返回键,会先回退到WebView的上一级页面,直到WebView没有历史栈时才会关闭当前页面
- 若加了AppBar leading的自定义逻辑,点击左上角返回按钮也会触发相同逻辑
内容的提问来源于stack exchange,提问作者Harsh Kumar Yadav
相关产品推荐
相关产品推荐

