dart - 如何在flutter中通过webview下载/创建pdf

标签 dart flutter flutter-layout flutter-dependencies

我创建了一个 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();
                }),
          ),
        ],
      ),
    );
  }

我期望,当我单击 WebView 中的打印或下载按钮时,它应该像任何其他浏览器一样工作。

最佳答案

你可以使用我的插件flutter_inappwebview ,这是一个 Flutter 插件,允许您添加内联 WebView 或打开应用内浏览器窗口,并且有很多事件、方法和选项来控制 WebView。

为了能够识别可下载的文件,您需要设置 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插件来获取我想要保存文件的文件夹。

关于dart - 如何在flutter中通过webview下载/创建pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247542/

相关文章:

function - Dart 中的类术语

android - Flutter Firebase Error Null fundtion(FirebaseUser)无法分配给参数,仪表类型 FutureOr <dynamic>

flutter - 在初始化期间读取静态变量| flutter

dart - PolymerDart 自定义元素与 Angular.dart 模型的双向绑定(bind)

dart - 在 Flutter 中使用完整的 Dart SDK

flutter - 警告 : Operand of null-aware operation '!' has type 'PaintingBinding' which excludes null

flutter - 参数类型 'Products Function(BuildContext, dynamic, dynamic)' 无法分配给参数类型 'Products Function(BuildContext)'

dart - Flutter:如何创建一行居中的单词,周围有一条线?

flutter - 如何在 flutter 中部分显示图像以获得幕后效果?

Flutter:将手势阻止到小部件下方