Flutter文件预览插件file_preview的使用

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

Flutter文件预览插件file_preview的使用

简介

file_preview 是一个用于在Flutter应用中预览多种文件格式的插件,支持在Android和iOS平台上预览常见的文档格式,如doc、docx、rtf、ppt、pptx、xls、xlsx、xlsm、csv、pdf、txt、epub、chm等。该插件在Android上使用腾讯TBS服务,在iOS上使用WKWebView进行文件预览。

支持的文件格式

格式 Android iOS
.doc
.docx
.ppt
.pptx
.xls
.xlsx
.pdf
.OFD
more TBS限制不可预览 WKWebView支持均可预览

集成步骤

1. pubspec.yaml

pubspec.yaml文件中添加file_preview依赖:

dependencies:
  file_preview: ^latest
2. 引入插件

在Dart文件中引入file_preview

import 'package:file_preview/file_preview.dart';
3. TBS初始化

由于Android平台使用TBS服务,因此必须在使用FilePreviewWidget之前完成TBS的初始化:

await FilePreview.initTBS(license: "your license");
4. 获取TBS版本

可以通过以下代码获取当前TBS的版本号:

String version = await FilePreview.tbsVersion();
5. 预览文件

在预览文件之前,建议先检查TBS是否已经初始化成功:

var isInit = await FilePreview.tbsHasInit();
if (!isInit) {
  await FilePreview.initTBS();
  return;
}

创建文件控制器并调用showFile方法来预览文件:

// 文件控制器
FilePreviewController controller = FilePreviewController();

// 切换文件
controller.showFile(path);

// 文件预览widget
FilePreviewWidget(
  controller: controller,
  width: 400,
  height: 600,
  path: widget.path,
  callBack: FilePreviewCallBack(
    onShow: () {
      print("文件打开成功");
    },
    onDownload: (progress) {
      print("文件下载进度$progress");
    },
    onFail: (code, msg) {
      print("文件打开失败 $code  $msg");
    },
  ),
),
6. 删除本地缓存

Android平台在预览在线文件时会将文件下载到本地缓存目录下,可以通过以下方法删除缓存:

await FilePreview.deleteCache();
7. HTTP配置

高版本的Android和iOS默认禁用HTTP请求,可以设置允许HTTP请求以防止文件加载失败。

  • Android:在android/app/src/main/res/xml目录下新建network_config.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true"/>
</network-security-config>

然后在android/app/src/main/AndroidManifest.xml中引用:

<application
       android:networkSecurityConfig="@xml/network_config">
  • iOS:在ios/Runner/Info.plist中添加以下配置:
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用file_preview插件:

import 'dart:io';
import 'dart:typed_data';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:file_preview/file_preview.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool isInit = false;
  String? version;

  [@override](/user/override)
  void initState() {
    _initTBS();
    super.initState();
  }

  void _initTBS() async {
    // 初始化TBS服务
    isInit = await FilePreview.initTBS(license: "your license");
    version = await FilePreview.tbsVersion();
    if (mounted) {
      setState(() {});
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('File Preview'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('TBS初始化 $isInit'),
            Text('TBS版本号 $version'),
            MaterialButton(
              color: Colors.blue,
              textColor: Colors.white,
              child: const Text('检测TBS是否初始化成功'),
              onPressed: () async {
                isInit = await FilePreview.tbsHasInit();
                setState(() {});
              },
            ),
            MaterialButton(
              color: Colors.blue,
              textColor: Colors.white,
              child: const Text('在线预览'),
              onPressed: () async {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (_) {
                      return FilePreviewPage(
                        title: "docx预览",
                        path: "https://gstory.vercel.app/ceshi/ceshi.docx",
                      );
                    },
                  ),
                );
              },
            ),
            MaterialButton(
              color: Colors.blue,
              textColor: Colors.white,
              child: const Text('本地文件预览'),
              onPressed: () async {
                FilePickerResult? result = await FilePicker.platform.pickFiles();
                if (result != null) {
                  File file = File(result.files.single.path!);
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (_) {
                        return FilePreviewPage(
                          title: "本地文件预览",
                          path: file.path,
                        );
                      },
                    ),
                  );
                }
              },
            ),
            MaterialButton(
              color: Colors.blue,
              textColor: Colors.white,
              child: const Text('清理本地缓存文件(android有效)'),
              onPressed: () async {
                var delete = await FilePreview.deleteCache();
                if (delete) {
                  print("缓存文件清理成功");
                }
              },
            ),
            MaterialButton(
              color: Colors.blue,
              textColor: Colors.white,
              child: const Text('在线视频(仅支持ios)'),
              onPressed: () async {
                if (Platform.isIOS) {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (_) {
                        return FilePreviewPage(
                          title: "在线视频(仅支持ios)",
                          path: "https://v.gsuus.com/play/xbo8Dkdg/index.m3u8",
                        );
                      },
                    ),
                  );
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

class FilePreviewPage extends StatelessWidget {
  final String title;
  final String path;

  const FilePreviewPage({Key? key, required this.title, required this.path}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: FilePreviewWidget(
          controller: FilePreviewController(),
          width: 400,
          height: 600,
          path: path,
          callBack: FilePreviewCallBack(
            onShow: () {
              print("文件打开成功");
            },
            onDownload: (progress) {
              print("文件下载进度$progress");
            },
            onFail: (code, msg) {
              print("文件打开失败 $code  $msg");
            },
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用file_preview插件来实现文件预览的示例代码。file_preview插件允许你在Flutter应用中预览不同类型的文件,如PDF、图像、文本等。

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

dependencies:
  flutter:
    sdk: flutter
  file_preview: ^x.y.z  # 请将x.y.z替换为最新的版本号

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

接下来,你可以在你的Flutter应用中使用这个插件。以下是一个简单的示例,展示如何预览一个PDF文件:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String? filePath;

  @override
  void initState() {
    super.initState();
    _loadFile();
  }

  Future<void> _loadFile() async {
    // 获取应用文档目录
    final directory = await getApplicationDocumentsDirectory();
    // 示例文件路径(你可以根据需要修改路径或文件名)
    String examplePdfPath = '${directory.path}/example.pdf';

    // 确保文件存在(这里只是示例,实际使用中你可能需要下载或复制文件到该路径)
    // 这里假设example.pdf文件已经存在于该路径
    setState(() {
      filePath = examplePdfPath;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Preview Example'),
      ),
      body: Center(
        child: filePath == null
            ? CircularProgressIndicator()
            : ElevatedButton(
                onPressed: () {
                  // 使用file_preview插件预览文件
                  FilePreview.open(
                    filePath: filePath!,
                    type: FileType.pdf, // 根据你的文件类型设置,比如FileType.image, FileType.text等
                    title: '预览PDF',
                  ).catchError((error) {
                    // 错误处理
                    print('预览文件失败: $error');
                  });
                },
                child: Text('预览文件')),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先获取应用的文档目录,并假设一个PDF文件已经存在于该目录的example.pdf路径下。
  2. initState方法中,我们尝试加载文件路径。
  3. 当文件路径加载完成后,我们在界面上显示一个按钮。点击按钮时,使用FilePreview.open方法打开文件预览。

请根据你的实际需求调整文件路径和类型。如果你需要预览其他类型的文件,比如图片或文本,只需将FileType.pdf替换为FileType.imageFileType.text等。

注意:确保你的设备上已经安装了能够处理相应文件类型的应用,例如PDF阅读器。如果设备上没有相应的应用,file_preview插件可能无法正常工作。

回到顶部