如何在不创建InAppWebView的情况下创建InAppWebViewController(flutter_inappwebview)?
如何在不创建InAppWebView的情况下创建InAppWebViewController(flutter_inappwebview)?
嘿,我刚好折腾过这个问题,InAppWebViewController.fromPlatform确实是官方提供的无UI创建控制器的方法,但它需要先拿到对应平台的WebView实例来包装,下面分iOS和Android给你具体的实现例子,顺便也给你提个更省心的替代方案:
分平台实现方式
Android端
你需要先创建AndroidWebView实例,初始化后包装成平台控制器,再转成InAppWebViewController:
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/src/android/android_web_view.dart'; Future<InAppWebViewController> createAndroidWebViewController() async { // 初始化AndroidWebView实例 final androidWebView = AndroidWebView(); await androidWebView.init(); // 包装成平台层控制器 final platformController = PlatformInAppWebViewController( androidWebView: androidWebView, ); // 转换为我们需要的InAppWebViewController return InAppWebViewController.fromPlatform(platformController); }
iOS端
逻辑类似,但需要创建WKWebView实例来包装:
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/src/ios/wk_web_view.dart'; import 'dart:io'; Future<InAppWebViewController> createIOSWebViewController() async { if (!Platform.isIOS) { return Future.error('这个方法仅适用于iOS平台'); } // 初始化WKWebView实例 final wkWebView = WKWebView(); await wkWebView.init(); // 包装成平台层控制器 final platformController = PlatformInAppWebViewController( iosWebView: wkWebView, ); // 转换为InAppWebViewController return InAppWebViewController.fromPlatform(platformController); }
更省心的替代方案:HeadlessInAppWebView
其实官方已经考虑到了“无UI执行网页操作”的场景,提供了HeadlessInAppWebView,它不需要你手动处理平台实例,直接就能拿到控制器,更推荐用这个:
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; Future<void> runHeadlessWebView() async { final headlessWebView = HeadlessInAppWebView( initialUrlRequest: URLRequest(url: Uri.parse('https://example.com')), onWebViewCreated: (controller) { // 这里直接拿到InAppWebViewController,想干嘛都行 controller.evaluateJavascript(source: 'document.body.innerText') .then((content) { print('网页内容:$content'); }); }, onLoadStop: (controller, url) { // 页面加载完成后的操作 controller.getTitle().then((title) { print('页面标题:$title'); }); }, ); // 启动无头WebView await headlessWebView.run(); // 使用完毕记得销毁,避免内存泄漏 await headlessWebView.dispose(); }
注意事项
- 不管用哪种方式,使用完控制器后一定要调用
dispose()方法,不然会有内存泄漏的风险; - 手动创建的控制器没有对应的UI组件,只能用来做后台操作,比如爬取网页内容、执行JS脚本等;
备注:内容来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

