Flutter WebView:实现AppBar按钮返回上页及无历史时返回应用
解决Flutter WebView页面返回按钮功能问题
你之前的代码失效核心原因是:WebViewController是在build方法里临时创建的,没有作为页面类的成员变量保存,导致你写的_exitApp方法里调用的controller和WebView实际使用的不是同一个实例,自然没法控制WebView返回。
按下面步骤修改就能实现需求:
- 在页面类中声明成员变量,用来持有WebViewController实例
- 在
initState方法里初始化控制器,避免每次build重建 - 修改AppBar按钮的点击逻辑,调用正确的返回处理方法
- 处理返回逻辑: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
相关产品推荐
相关产品推荐

