Flutter - 如何在 WebView 中下载文件?

Cod*_*oet 10 android android-webview dart flutter

我正在使用,flutter_webview_plugin: ^0.3.8但我有同样的问题webview_flutter: ^0.3.13

在 webview 中,我想利用一个网站,该网站在成功完成验证码后触发文件下载。但是,我完成了验证码,没有任何反应,也没有下载。

Flutter 中是否有类似 webview 下载侦听器(“webview.setDownloadListener”)的东西?我只需要这个用于 Android。

如果没有,有没有办法从 Flutter 的 webview 下载文件?

Lor*_*lli 6

类似的问题可以在这里找到!

\n\n

您可以使用我的插件flutter_inappwebview,这是一个 Flutter 插件,允许您添加内联 WebView 或打开应用内浏览器窗口,并且有很多事件、方法和选项来控制 WebView。它可以识别Android(使用setDownloadListener)和iOS平台上的可下载文件!

\n\n

我在这里报告我对类似问题给出的相同答案:

\n\n

为了能够识别可下载的文件,您需要设置该useOnDownloadStart: true选项,然后您就可以监听onDownloadStart\xc2\xa0事件!

\n\n

另外,例如,在 Android 上,您需要在AndroidManifest.xml文件中添加写入权限:

\n\n
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您需要使用permission_handler插件请求许可。相反,要有效下载文件,您可以使用flutter_downloader插件。

\n\n

以下是使用http://ovh.net/files/(特别是http://ovh.net/files/1Mio.dat作为 URL)来测试下载的完整示例:

\n\n
import \'dart:async\';\nimport \'package:flutter/material.dart\';\nimport \'package:flutter_inappwebview/flutter_inappwebview.dart\';\nimport \'package:flutter_downloader/flutter_downloader.dart\';\nimport \'package:path_provider/path_provider.dart\';\nimport \'package:permission_handler/permission_handler.dart\';\n\nFuture main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await FlutterDownloader.initialize(\n      debug: true // optional: set false to disable printing logs to console\n  );\n  await Permission.storage.request();\n  runApp(new MyApp());\n}\n\nclass MyApp extends StatefulWidget {\n  @override\n  _MyAppState createState() => new _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> {\n  InAppWebViewController webView;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: Scaffold(\n        appBar: AppBar(\n          title: const Text(\'InAppWebView Example\'),\n        ),\n        body: Container(\n            child: Column(children: <Widget>[\n          Expanded(\n              child: InAppWebView(\n            initialUrl: "http://ovh.net/files/1Mio.dat",\n            initialHeaders: {},\n            initialOptions: InAppWebViewGroupOptions(\n              crossPlatform: InAppWebViewOptions(\n                debuggingEnabled: true,\n                useOnDownloadStart: true\n              ),\n            ),\n            onWebViewCreated: (InAppWebViewController controller) {\n              webView = controller;\n            },\n            onLoadStart: (InAppWebViewController controller, String url) {\n\n            },\n            onLoadStop: (InAppWebViewController controller, String url) {\n\n            },\n            onDownloadStart: (controller, url) async {\n              print("onDownloadStart $url");\n              final taskId = await FlutterDownloader.enqueue(\n                url: url,\n                savedDir: (await getExternalStorageDirectory()).path,\n                showNotification: true, // show download progress in status bar (for Android)\n                openFileFromNotification: true, // click on notification to open downloaded file (for Android)\n              );\n            },\n          ))\n        ])),\n      ),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,如您所见,我还使用path_provider插件来获取我想要保存文件的文件夹。

\n