我已经创建了一个webviewscaffold,但在从webview浏览时无法从它下载任何东西,我创建了,但当我单击按钮时,它什么也不做。我不知道从哪里开始,就像在其他可以下载和预览的浏览器中一样,我正试图在这里实现同样的事情。
class AppState extends State<App> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
Align(
alignment: Alignment(1, 1),
child: Container(
child: Web(), // it is a statefulwidget that have WebviewScaffold, i have created it on a new page and imported/used here
),
),
Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 20.0),
)
],
),
Align(
alignment: Alignment(0.7, -0.93),
child: FloatingActionButton(
tooltip: "Share",
child: Icon(
Icons.share,
color: Colors.amberAccent,
),
onPressed: () {
_onShareTap();
}),
),
],
),
);
}我希望,当我点击网页视图中的打印或下载按钮时,它应该像任何其他浏览器一样工作。
发布于 2020-05-31 21:00:31
您可以使用my plugin flutter_inappwebview,它是一个Flutter插件,允许您添加内联WebViews或打开应用内浏览器窗口,它有许多事件、方法和选项来控制WebViews。
为了能够识别可下载的文件,你需要设置useOnDownloadStart: true选项,然后你就可以收听onDownloadStart事件了!
另外,例如,在安卓系统中,你需要在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插件来获取我想要保存文件的文件夹。
发布于 2020-01-24 23:20:31
如果你是html页面的所有者,你可以检查适合我的变通方法。在onclick html页面源代码中,为特定的资源链接添加onclick函数:
function downloadpdf() {
var currentHref = window.location.href;
window.history.pushState(null, null, '/app/somepdf.pdf');
setTimeout(() => window.location.replace(currentHref), 1000);
}在Flutter代码中添加listener:
StreamSubscription<String> _onWebViewUrlChanged;
_onWebViewUrlChanged =
FlutterWebviewPlugin().onUrlChanged.listen((String url) {
if (url.contains('.pdf')) {
launchURL(url);
}
});launchURL将在外部浏览器窗口中打开预定义的url。所以你可以从flutter_webview_plugin下载pdf/etc。
您应该添加一些特定于应用程序的js/flutter魔法
https://stackoverflow.com/questions/56247542
复制相似问题