【问题标题】:How do i enable downloads in flutter webview如何在 Flutter Webview 中启用下载
【发布时间】:2020-05-14 04:25:54
【问题描述】:

我是 Flutter 的新手。我正在开发一个显示网站某些页面的移动应用程序,其中一个页面有一个链接,用户/访问者可以通过该链接下载 PDF 文件。此链接适用于我尝试过的大多数常规浏览器,但是当我在我的应用程序中单击它时,它不起作用。我正在使用“WebviewScaffold”来显示页面。请问我该如何解决这个问题。 谢谢

【问题讨论】:

    标签: flutter webview


    【解决方案1】:

    可以在herehere 找到类似的问题!我在这里报告了与类似问题相同的answer

    你可以使用我的插件flutter_inappwebview,这是一个Flutter插件,允许你添加内联WebViews或打开一个应用内浏览器窗口,并且有很多事件、方法和选项来控制WebViews。它可以识别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 插件来获取我要保存文件的文件夹。

    【讨论】:

      【解决方案2】:

      Flutter webview 目前处于开发者预览阶段,还有很多功能尚未开发,包括下载文件。 如果在常规浏览器中可以下载,您可能想使用 url_launcher 包而不是 webview 在手机浏览器中打开您的网址并下载。

      【讨论】:

        猜你喜欢
        • 2020-01-16
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 2019-12-04
        • 2022-11-06
        相关资源
        最近更新 更多