作者 | 星星y
地址 | https://www.jianshu.com/p/dae373ca9f0f
前言
哎,Flutter真香啊
在用移动设备加载H5页面时,一些公共资源如css,js,图片等如果比较大时,就需要通过拦截网络,改从本地资源加载。在Android原生WebView
中,我们可以在WebViewClient
中的shouldInterceptRequest
方法来拦截替换资源。
然而在Flutter中的WebView插件,不管是官方的webview_flutter,还是flutter_webview_plugin都不支持加载本地资源。
庆幸的是webview_flutter
底层实现是基于WebView
(Android)和WKWebView
(iOS)。只要在官方webview_flutter上稍作修改,就可以实现离线资源加载。
项目地址
github: https://github.com/iamyours/webview_flutter
pub:https://pub.dev/packages/iwebview_flutter
Android端实现
首先我们从webview_flutter
中下载最新Archive(当前使用0.3.15+1
)。https://pub.dev/packages/webview_flutter/versions解压后,使用AndroidStudio打开,右键工程目录,使用Android模式打开
如果要实现WebView
请求拦截,就必须给webView设置WebViewCilent
,全局搜索setWebViewClient
找到只有一处实现:
//FlutterWebView.javaprivate void applySettings(Map<String, Object> settings) {
for (String key : settings.keySet()) {
switch (key) {
...case "hasNavigationDelegate":
final boolean hasNavigationDelegate = (boolean) settings.get(key);
final WebViewClient webViewClient =
flutterWebViewClient.createWebViewClient(hasNavigationDelegate);
webView.setWebViewClient(webViewClient);break;
...
}
}
}
修改WebViewClient
通过以上代码我们知道具体逻辑在createWebViewClient
方法中:
WebViewClient createWebViewClient(boolean hasNavigationDelegate) {
this.hasNavigationDelegate = hasNavigationDelegate;if (!hasNavigationDelegate || android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return internalCreateWebViewClient();
}return internalCreateWebViewClientCompat();
}
然后在internalCreate