安卓10 flutter webview 回退会闪退
在Flutter中使用WebView时,如果Webview中的网页可以通过浏览器的回退按钮回退到上一页面,这可能会导致应用闪退。这是因为Flutter WebView插件在某些情况下与浏览器的回退栈不同步,导致无法正确处理回退事件。
解决方法:
- 使用
WebViewController
的canGoBack
和goBack
方法来管理回退事件,而不依赖于系统的回退按钮。 - 在WebView控制器中监听浏览器的回退事件,并在Flutter中处理回退逻辑。
示例代码:
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebViewExample extends StatefulWidget {
@override
_WebViewExampleState createState() => _WebViewExampleState();
}
class _WebViewExampleState extends State<WebViewExample> {
WebViewController _controller;
bool _canGoBack = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter WebView Example'),
leading: _canGoBack ? IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () => _controller.goBack(),
) : null,
),
body: WebView(
initialUrl: 'https://www.example.com',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
},
onPageFinished: (String url) {
_controller.evaluateJavascript('javascript:alert("Page Finished Loading");').then((String result) {
// Handle JavaScript result
});
},
navigationDelegate: (NavigationRequest request) {
if (request.url.startsWith('https://www.example.com')) {
print('Allowing navigation to $request.url');
return NavigationDecision.navigate;
}
print('Blocking navigation to $request.url');
return NavigationDecision.prevent;
},
onPageStarted: (String url) {
setState(() {
_canGoBack = false;
});
},
onHistoryChanged: (String url) {
_controller.canGoBack().then((bool canGoBack) {
setState(() {
_canGoBack = canGoBack;
});
});
},
),
);
}
}
在这个示例中,我们使用onHistoryChanged
回调来监听浏览器的历史记录变化,并使用canGoBack()
方法来更新_canGoBack
状态。当_canGoBack
为true
时,会在应用栏显示回退按钮,并且通过goBack()
方法处理回退事件。这样可以避免与系统的回退事件同步问题,从而避免闪退。
评论已关闭