[英]Flutter - How to download files in WebView?
我正在使用flutter_webview_plugin: ^0.3.8
但我對webview_flutter: ^0.3.13
: ^0.3.13 有同樣的問題。
在 webview 中,我想使用一個在成功完成驗證碼時觸發文件下載的網站。 但是,我完成了驗證碼,沒有任何反應,沒有下載。
Flutter 中是否有類似 webview 下載監聽器(“webview.setDownloadListener”)的東西? 我只需要這個用於Android。
如果沒有,有沒有辦法從 Flutter 中的 webview 下載文件?
可以在這里找到類似的問題!
你可以使用我的插件flutter_inappwebview ,它是一個 Flutter 插件,允許你添加內聯 WebView 或打開應用內瀏覽器窗口,並且有很多事件、方法和選項來控制 WebView。 它可以識別 Android(使用setDownloadListener
)和 iOS 平台中的可下載文件!
我在這里報告我對類似問題給出的相同答案:
為了能夠識別可下載的文件,需要設置useOnDownloadStart: true
選項,然后才能監聽onDownloadStart
事件!
此外,例如,在 Android 上,您需要在AndroidManifest.xml
文件中添加寫入權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后,您需要使用permission_handler插件請求許可。 相反,為了有效地下載文件,您可以使用flutter_downloader插件。
這是一個使用http://ovh.net/files/ (特別是http://ovh.net/files/1Mio.dat作為 URL)來測試下載的完整示例:
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();
await FlutterDownloader.initialize(
debug: true // optional: set false to disable printing logs to console
);
await Permission.storage.request();
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
InAppWebViewController webView;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('InAppWebView Example'),
),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: InAppWebView(
initialUrl: "http://ovh.net/files/1Mio.dat",
initialHeaders: {},
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
debuggingEnabled: true,
useOnDownloadStart: true
),
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) {
},
onDownloadStart: (controller, url) async {
print("onDownloadStart $url");
final taskId = await FlutterDownloader.enqueue(
url: url,
savedDir: (await getExternalStorageDirectory()).path,
showNotification: true, // show download progress in status bar (for Android)
openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);
},
))
])),
),
);
}
}
在這里,如您所見,我還使用path_provider插件來獲取要保存文件的文件夾。
只需將此代碼添加到您的 AndroidManifest.xml
<provider
android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
android:authorities="${applicationId}.flutter_downloader.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
並將此代碼添加到您的 AndroidManifest.xml
它對我有用
這個對我有用
需要插件https://pub.dev/packages/url_launcher
將此代碼添加到您的項目中以從 Flutter webview 下載文件
onDownloadStart: (controller, url,) async {
// print("onDownloadStart $url");
final String _url_files = "$url";
void _launchURL_files() async =>
await canLaunch(_url_files) ? await launch(_url_files) : throw 'Could not launch $_url_files';
_launchURL_files();
},
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.