Flutter如何使用inappwebview实现网页内文件下载功能
Flutter InAppWebView 下载功能参数报错解决方案
你遇到的参数报错是因为flutter_inappwebview v6.0及以上版本对原有API做了不兼容更新,旧教程中的v5.x版本参数已废弃,按以下规则修改即可:
initialUrl参数已废弃,替换为initialUrlRequest,传入URLRequest(url: WebUri("目标页面链接"))debuggingEnabled配置已从InAppWebViewOptions中移除,改为全局静态方法调用,在main函数初始化阶段执行InAppWebViewController.setWebContentsDebuggingEnabled(true)即可useOnDownloadStart配置已废弃,不需要额外声明即可监听下载事件onDownloadStart回调的url参数类型从字符串改为WebUri对象,传给FlutterDownloader时需要调用toString()方法转换类型- Android 13及以上版本需要额外申请
POST_NOTIFICATIONS权限才能正常显示下载通知
修改后的完整可运行代码如下:
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); // 开启webview调试 await InAppWebViewController.setWebContentsDebuggingEnabled(true); await FlutterDownloader.initialize( debug: true // 可选:发布版本设为false关闭控制台日志 ); // 同时适配低版本存储权限和高版本通知权限 Map<Permission, PermissionStatus> statuses = await [ Permission.storage, Permission.postNotifications, ].request(); runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => new _MyAppState(); } class _MyAppState extends State<MyApp> { InAppWebViewController? _webViewController; @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('InAppWebView 下载示例'), ), body: Container( child: Column(children: <Widget>[ Expanded( child: InAppWebView( // 替换旧的initialUrl参数 initialUrlRequest: URLRequest(url: WebUri("http://ovh.net/files/1Mio.dat")), initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( // 移除废弃的debuggingEnabled和useOnDownloadStart配置 ), ), onWebViewCreated: (InAppWebViewController controller) { _webViewController = controller; }, onDownloadStart: (controller, url) async { print("onDownloadStart $url"); final taskId = await FlutterDownloader.enqueue( // 转换WebUri为字符串 url: url.toString(), savedDir: (await getExternalStorageDirectory())!.path, showNotification: true, // Android端在状态栏显示下载进度 openFileFromNotification: true, // Android端点击通知打开下载的文件 ); }, ), ), ]), ), ), ); } }
内容的提问来源于stack exchange,提问作者lukman azhari
相关产品推荐
相关产品推荐

