Flutter快速预览插件quick_look的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter快速预览插件quick_look的使用

quick_look 是一个用于在Flutter应用中调用Apple QuickLook (QLPreviewController) 的插件。它允许你在iOS设备上快速预览文件,如PDF、图片等。

开始使用

加载并打开文件

要使用 quick_look 插件打开文件,请按照以下步骤进行操作:

  1. 加载文件:从Flutter项目的资源(assets)中加载文件。
  2. 保存到临时文件:将文件写入应用程序的文档目录中。
  3. 使用QuickLook打开文件:通过 QuickLook.openURL 方法打开文件。

以下是示例代码:

import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';
import 'package:quick_look/quick_look.dart';

Future<void> openFile(String path) async {
  final byteData = await rootBundle.load('assets/$path');
  final String directory = (await getApplicationDocumentsDirectory()).path;
  final tempFile = await File('$directory/$path').writeAsBytes(
      byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
  await QuickLook.openURL(tempFile.path);
}

支持的文件类型

你可以查看 Apple官方文档 来了解哪些类型的文件可以被支持和预览。

完整示例Demo

以下是一个完整的示例程序,展示了如何使用 quick_look 插件来打开单个和多个文件。

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';
import 'package:quick_look/quick_look.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Timer? _timer;
  int secondsPassedSinceLastOpen = 0;

  @override
  void dispose() {
    _timer?.cancel();
    super.dispose();
  }

  Future<void> openFiles(List<String> paths) async {
    final String directory = (await getApplicationDocumentsDirectory()).path;
    var finalPaths = <String>[];
    for (final path in paths) {
      final byteData = await rootBundle.load('assets/$path');
      final tempFile = await File('$directory/$path')
          .writeAsBytes(byteData.buffer.asUint8List(
              byteData.offsetInBytes, byteData.lengthInBytes));
      finalPaths.add(tempFile.path);
    }
    await QuickLook.openURLs(
      resourceURLs: finalPaths,
      initialIndex: finalPaths.length - 1,
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true),
      home: Scaffold(
        appBar: AppBar(title: const Text('QuickLook for iOS')),
        body: SafeArea(
          child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 16),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                const Spacer(),
                ElevatedButton(
                  onPressed: () async {
                    const path = 'lorem_ipsum.pdf';
                    setState(() {
                      secondsPassedSinceLastOpen = 0;
                    });
                    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
                      setState(() {
                        secondsPassedSinceLastOpen++;
                      });
                    });
                    await openFile(path);
                    _timer?.cancel();
                  },
                  child: const Text('Open single demo PDF',
                      style: TextStyle(fontSize: 24),
                      textAlign: TextAlign.center),
                ),
                ElevatedButton(
                  onPressed: () async {
                    const paths = ['lorem_ipsum.pdf', 'image1.jpg', 'image2.jpg'];
                    setState(() {
                      secondsPassedSinceLastOpen = 0;
                    });
                    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
                      setState(() {
                        secondsPassedSinceLastOpen++;
                      });
                    });
                    await openFiles(paths);
                    _timer?.cancel();
                  },
                  child: const Text(
                    'Open multiple assets',
                    style: TextStyle(fontSize: 24),
                    textAlign: TextAlign.center,
                  ),
                ),
                const SizedBox(height: 12),
                Text(
                  'Seconds since last open: $secondsPassedSinceLastOpen',
                  style: const TextStyle(fontSize: 18),
                  textAlign: TextAlign.center,
                ),
                const Text(
                  '(method awaits native modal close before resolving future)',
                  style: TextStyle(fontSize: 12),
                  textAlign: TextAlign.center,
                ),
                const Spacer(),
                const Text(
                  'Photos from \nhttps://unsplash.com/photos/QeVmJxZOv3k\nhttps://unsplash.com/photos/Yh2Y8avvPec',
                  textAlign: TextAlign.center,
                ),
                const SizedBox(height: 12),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Future<void> openFile(String path) async {
    final byteData = await rootBundle.load('assets/$path');
    final String directory = (await getApplicationDocumentsDirectory()).path;
    final tempFile = await File('$directory/$path').writeAsBytes(
        byteData.buffer.asUint8List(
            byteData.offsetInBytes, byteData.lengthInBytes));
    await QuickLook.openURL(tempFile.path);
  }
}

以上示例演示了如何使用 quick_look 插件在Flutter应用中实现文件预览功能。希望这能帮助你更好地理解和使用这个插件!


更多关于Flutter快速预览插件quick_look的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter快速预览插件quick_look的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用quick_look插件进行快速预览的示例代码。quick_look插件允许开发者在Flutter应用中快速预览文件,如图片、PDF等。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加quick_look依赖:

dependencies:
  flutter:
    sdk: flutter
  quick_look: ^3.0.0  # 请确保使用最新版本

然后运行flutter pub get来安装依赖。

步骤 2: 导入插件

在你的Dart文件中导入quick_look插件:

import 'package:quick_look/quick_look.dart';

步骤 3: 使用QuickLook预览文件

下面是一个完整的示例,展示如何使用quick_look插件来预览一个本地文件(例如PDF文件):

import 'package:flutter/material.dart';
import 'package:quick_look/quick_look.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Quick Look Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<void> _previewFile() async {
    // 获取应用文档目录
    final directory = await getApplicationDocumentsDirectory();
    final filePath = directory.path + '/sample.pdf';

    // 确保文件存在(这里假设已经有一个sample.pdf文件在指定位置)
    // 实际使用中,你可能需要下载或复制文件到这个位置

    // 使用QuickLook预览文件
    await QuickLook.previewFile(filePath);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Quick Look Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _previewFile,
          child: Text('Preview PDF'),
        ),
      ),
    );
  }
}

注意事项

  1. 文件路径:确保文件路径是正确的,并且文件存在于该路径。在示例中,我们假设在应用的文档目录中已经有一个名为sample.pdf的文件。

  2. 权限:如果你的应用需要访问外部存储中的文件,确保在Android和iOS上都已经请求并获得了相应的存储权限。

  3. 平台支持quick_look插件主要支持iOS和macOS,Android上的支持可能有限。如果你需要在Android上进行类似的操作,可能需要使用其他插件或方法。

通过上述代码,你可以在Flutter应用中快速集成并使用quick_look插件来预览文件。希望这对你有帮助!

回到顶部