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

如何让现有webview_flutter代码适配V4版本更新?

适配webview_flutter V4版本的代码修改方案

以下是针对你的代码适配V4版本的完整修改方案,附关键改动说明:

修改后的完整代码

import 'package:webview_flutter/webview_flutter.dart';
import 'dart:io';

// 初始化WebViewController
final WebViewController _controller = WebViewController()
  ..setJavaScriptMode(JavaScriptMode.unrestricted)
  ..loadRequest(Uri.parse(widget.url))
  ..setNavigationDelegate(
    NavigationDelegate(
      onNavigationRequest: (NavigationRequest request) {
        // 保留你的导航逻辑,必须返回NavigationDecision枚举
        return NavigationDecision.navigate;
      },
    ),
  )
  ..setOnProgressListener((int progress) {
    // 你的进度处理逻辑,比如更新进度条
  })
  ..setGestureNavigationEnabled(true);

// Android平台专属配置(对应原SurfaceAndroidWebView)
if (Platform.isAndroid) {
  final AndroidWebViewController androidController =
      _controller.platform as AndroidWebViewController;
  androidController.setWebViewSettings(
    const AndroidWebViewSettings(
      useHybridComposition: true,
    ),
  );
}

// 页面中使用WebViewWidget替代原WebView组件
WebViewWidget(controller: _controller)

关键改动说明

  • 控制器初始化逻辑:V4移除了通过Completer获取控制器的方式,改为直接初始化WebViewController并通过链式调用完成所有配置。
  • 初始页面加载:原initialUrl参数替换为loadRequest(Uri.parse(widget.url)),需要将字符串URL转为Uri对象。
  • JavaScript权限配置:原javascriptMode参数改为通过setJavaScriptMode方法设置。
  • 导航代理逻辑:原navigationDelegate替换为setNavigationDelegate,使用NavigationDelegate类封装导航回调,onNavigationRequest必须返回NavigationDecision枚举值(决定是否允许导航)。
  • 进度监听:原onProgress回调改为通过setOnProgressListener方法设置。
  • 手势导航设置:原gestureNavigationEnabled参数改为通过setGestureNavigationEnabled方法配置。
  • Android平台配置:原WebView.platform = SurfaceAndroidWebView()的逻辑,替换为通过AndroidWebViewController设置useHybridComposition: true,这是V4中启用SurfaceWebView的等效配置。
  • 组件替换:原WebView组件替换为WebViewWidget,通过controller参数传入已配置好的WebViewController。

内容的提问来源于stack exchange,提问作者zakiblacki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:35:17