You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 09:28:07