webview_flutter_android 4.3.0使用

webview_flutter_android 4.3.0 使用简介

版本:适合未使用前的阅读

文档应包含以下10个核心章节:

  • 一、核心类说明
  • 二、参数类型详解
  • 三、高级配置API
  • 四、性能优化配置
  • 五、调试工具
  • 六、必要配置
  • 七、扩展功能与辅助类
  • 八、生命周期管理
  • 九、高级交互示例
  • 十、疑难解答

==================================================

一、核心类说明

==================================================

1. AndroidWebViewController 类

dart 复制代码
/// Android平台WebView的核心控制器,继承自PlatformWebViewController
/// 用于管理WebView的生命周期、配置和交互
class AndroidWebViewController {

  /// 构造函数
  /// @param params - 平台WebViewController创建参数
  AndroidWebViewController(PlatformWebViewControllerCreationParams params);

  /// 设置用户代理字符串
  /// @param userAgent - 要设置的UA字符串,传null则使用系统默认
  Future<void> setUserAgent(String? userAgent);

  /// 设置WebView背景颜色
  /// @param color - 使用Flutter的Color对象(支持透明度)
  Future<void> setBackgroundColor(Color color);

  /// 配置JavaScript执行模式
  /// @param mode - JavaScript模式枚举:
  ///   - disabled: 完全禁用JS执行
  ///   - unrestricted: 允许执行所有JS代码(包括alert等)
  Future<void> setJavaScriptMode(JavaScriptMode mode);

  /// 添加JavaScript通信通道
  /// @param name - 通道名称(需与JS端保持一致)
  /// @param onMessageReceived - 消息接收回调
  /// 示例:JS端调用 window.FlutterBridge.postMessage('Hello')
  Future<void> addJavaScriptChannel(
    String name, {
    required void Function(JavaScriptMessage) onMessageReceived,
  });

  /// 加载URL请求
  /// @param url - 要加载的URL地址
  /// @param headers - 附加的HTTP请求头(可选)
  Future<void> loadRequest(String url, {Map<String, String>? headers});

  /// 执行JavaScript代码
  /// @param javascript - 要执行的JS代码字符串
  /// @return 执行结果(可能为null)
  Future<String?> evaluateJavascript(String javascript);

  /// 清除缓存(包括内存和磁盘缓存)
  Future<void> clearCache();
}

2. AndroidNavigationDelegate 类

dart 复制代码
/// 处理WebView导航事件的委托类
class AndroidNavigationDelegate {

  /// 构造函数
  /// @param params - 平台导航委托创建参数
  AndroidNavigationDelegate(PlatformNavigationDelegateCreationParams params);

  /// 导航请求回调
  /// 参数:
  ///   - request: 包含url和isMainFrame的导航请求对象
  /// 返回值:
  ///   - NavigationDecision.navigate: 允许导航
  ///   - NavigationDecision.prevent: 阻止导航
  NavigationRequestCallback onNavigationRequest;

  /// 页面开始加载回调
  /// @param url - 开始加载的URL
  PageStartedCallback onPageStarted;

  /// 页面加载完成回调
  /// @param url - 加载完成的URL
  PageFinishedCallback onPageFinished;

  /// 资源加载错误回调
  /// @param error - 包含errorCode和description的错误对象
  WebResourceErrorCallback onWebResourceError;
}

3. AndroidWebViewWidget 类

dart 复制代码
/// Android平台的WebView渲染组件
class AndroidWebViewWidget extends StatelessWidget {
  
  /// 构造函数
  /// @param controller - WebViewController实例(必须)
  /// @param navigationDelegate - 导航委托实例(可选)
  /// @param creationParams - 创建参数(可选)
  const AndroidWebViewWidget({
    required PlatformWebViewController controller,
    PlatformNavigationDelegate? navigationDelegate,
    PlatformWebViewCreationParams? creationParams,
  });

  /// 手势识别器集合
  /// 用于处理WebView内的手势交互(如滑动、长按等)
  final Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers;

  /// WebView创建完成回调
  /// 在WebView实例化完成后触发
  final WebViewCreatedCallback? onWebViewCreated;

  /// 是否启用缩放功能
  /// 默认false(禁用双指缩放)
  final bool zoomEnabled;
}

==================================================

二、参数类型详解

==================================================

1. JavaScriptMode 枚举

dart 复制代码
/// JavaScript执行模式配置
enum JavaScriptMode {
  disabled,    // 完全禁用JavaScript
  unrestricted // 允许执行所有JavaScript代码
}
dart 复制代码
/// 导航请求信息封装
class NavigationRequest {
  final String url;       // 请求的目标URL
  final bool isMainFrame; // 是否为主框架请求
}

3. WebResourceError 类

dart 复制代码
/// Web资源错误信息
class WebResourceError {
  final int errorCode;     // 错误代码(参考Android WebViewClient错误码)
  final String description;// 错误描述(英文原文)
}

==================================================

三、高级配置API

==================================================

1. AndroidWebViewCookieManager 类

dart 复制代码
/// Cookie管理工具类
class AndroidWebViewCookieManager {
  
  /// 设置Cookie
  /// @param cookie - WebViewCookie对象
  Future<void> setCookie(WebViewCookie cookie);
}

/// Cookie数据结构
class WebViewCookie {
  final String name;   // Cookie名称
  final String value;  // Cookie值
  final String domain; // 作用域
  final String path;   // 路径
}

2. 文件选择器配置

dart 复制代码
/// 注册文件选择处理器
AndroidWebViewPlatform.instance.registerFileChooserHandler(
  (FileChooserParams params) async {
    // 返回用户选择的文件路径列表
    return await FilePicker.platform.pickFiles();
  }
);

3. 初始化配置

dart 复制代码
/// 平台初始化配置
AndroidWebViewPlatform.instance.initialize(
  androidInitializationSettings: AndroidInitializationSettings(
    hardwareAcceleration: true,  // 启用硬件加速渲染
    enableHybridComposition: true, // 混合合成模式(必须为true)
    useTextureView: false,       // 使用SurfaceView替代TextureView
  )
);

==================================================

四、性能优化配置

==================================================

1. 缓存策略

dart 复制代码
AndroidWebViewPlatform.instance.setCacheMode(
  cacheMode: AndroidCacheMode.loadElseNetwork, // 优先使用缓存
  maxCacheSize: 100 * 1024 * 1024 // 最大缓存100MB
);

2. 性能监控指标

dart 复制代码
/// 可用监控指标枚举
enum AndroidPerformanceMetric {
  navigationTiming,  // 导航时间统计
  resourceTiming,    // 资源加载时间
  frameTiming,       // 渲染帧率
}

==================================================

五、调试工具

==================================================

dart 复制代码
/// 启用WebView内容调试(需在debug模式)
if (kDebugMode) {
  AndroidWebView.setWebContentsDebuggingEnabled(true);
}

==================================================

六、必要配置

==================================================

AndroidManifest.xml 权限

js 复制代码
<!-- 必须添加以下权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

build.gradle 最低配置

js 复制代码
android {
    compileSdkVersion 33
    minSdkVersion 20  // 最低支持Android 5.0
    ...
}

==================================================

七、扩展功能与辅助类

==================================================

1. AndroidWebViewPlatform 类

dart 复制代码
/// Android平台WebView的全局配置入口
class AndroidWebViewPlatform {

  /// 单例实例
  static final instance = AndroidWebViewPlatform();

  /// 初始化平台设置
  /// @param androidInitializationSettings - Android专用初始化参数
  void initialize({
    required AndroidInitializationSettings androidInitializationSettings,
  });

  /// 注册文件选择处理器
  /// @param handler - 处理函数需返回文件路径列表
  void registerFileChooserHandler(
    Future<List<String>?> Function(FileChooserParams params) handler
  );
}

2. AndroidInitializationSettings 类

dart 复制代码
/// Android平台初始化参数配置
class AndroidInitializationSettings {
  final bool hardwareAcceleration; // 是否启用硬件加速(默认true)
  final bool enableHybridComposition; // 启用混合合成模式(必须为true)
  final bool useTextureView; // 使用TextureView替代SurfaceView(默认false)
}

3. FileChooserParams 类

dart 复制代码
/// 文件选择器参数封装
class FileChooserParams {
  final bool allowMultiple; // 是否允许多选
  final List<String> mimeTypes; // 允许的MIME类型
}

==================================================

八、生命周期管理

==================================================

1. WebView创建流程

  1. 初始化控制器:
dart 复制代码
   final controller = AndroidWebViewController(
     PlatformWebViewControllerCreationParams()
   );
  1. 配置导航委托:
dart 复制代码
controller.navigationDelegate = AndroidNavigationDelegate(
  onNavigationRequest: (request) {
    if (!_validateUrl(request.url)) {
      return NavigationDecision.prevent;
    }
    return NavigationDecision.navigate;
  }
);
  1. 构建Widget:
dart 复制代码
AndroidWebViewWidget(controller: controller)

2. 资源释放流程

dart 复制代码
/// 在State的dispose方法中释放资源
@override
void dispose() {
controller.dispose(); // 释放控制器
_cookieManager.clear(); // 清理Cookie
super.dispose();
}

==================================================

九、高级交互示例

  1. JS与Flutter双向通信
dart 复制代码
/// Flutter端注册通道
controller.addJavaScriptChannel(
'Scanner',
onMessageReceived: (message) {
final result = await scanBarcode();
controller.evaluateJavascript('onScanResult("$result")');
}
);


/// JS端调用
window.Scanner.postMessage('startScan');
  1. 自定义下载管理器
dart 复制代码
controller.navigationDelegate = AndroidNavigationDelegate(
onNavigationRequest: (request) {
if (request.url.endsWith('.apk')) {
_startDownload(request.url);
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
}
);

==================================================

十、疑难解答

  1. 混合合成模式异常
    症状:Android 10+设备白屏
    解决方案:
dart 复制代码
AndroidWebViewPlatform.instance.initialize(
  androidInitializationSettings: AndroidInitializationSettings(
    enableHybridComposition: true, // 必须启用
  )
);
  1. Cookie存储失效
    症状:登录状态无法保持
    解决方案:
dart 复制代码
<!-- 在AndroidManifest.xml中添加 -->
<application
  android:usesCleartextTraffic="true"
  android:allowBackup="false">
  1. 文件上传兼容性问题
    症状:部分机型无法选择文件
    解决方案:
dart 复制代码
// 在文件选择回调中处理路径转换
registerFileChooserHandler((params) async {
  final result = await FilePicker.platform.pickFiles();
  return result?.files
    .map((f) => f.path?.replaceFirst('file://', ''))
    .toList();
});

==================================================

文档更新日志

补充混合合成模式配置说明

增加文件选择器路径处理示例

完善生命周期管理章节


相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui