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

问题描述 投票:8回答:1

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

在webview中,我想利用一个网站,在成功完成验证码后触发文件下载。然而,我完成了验证码,但什么都没有发生,没有下载。

在Flutter中是否有类似webview下载监听器的东西("webview.setDownloadListener")?我只需要安卓系统有这个功能。

如果没有,在Flutter中有没有从webview下载文件的方法?

android flutter dart android-webview
1个回答
1
投票

类似的问题可以找到 此处!

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

我在这里报告同样的 回答 的,我给类似的问题。

为了能够识别可下载的文件,你需要设置... useOnDownloadStart: true 选项,然后你可以听 onDownloadStart 事件!

另外,例如,在Android上,你需要在你的 AndroidManifest.xml 文件。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后,你需要使用 许可处理程序 插件。相反,为了有效地下载你的文件,你可以使用 溅射下载器 插件。

下面是一个完整的例子,使用 http:/ovh.netfiles (特别是 http:/ovh.netfiles1Mio.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 插件来获取我想保存文件的文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.