Flutter文件预览插件file_preview的使用
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 | ✅ | ✅ |
✅ | ✅ | |
.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
更多关于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('预览文件')),
),
);
}
}
在这个示例中:
- 我们首先获取应用的文档目录,并假设一个PDF文件已经存在于该目录的
example.pdf
路径下。 - 在
initState
方法中,我们尝试加载文件路径。 - 当文件路径加载完成后,我们在界面上显示一个按钮。点击按钮时,使用
FilePreview.open
方法打开文件预览。
请根据你的实际需求调整文件路径和类型。如果你需要预览其他类型的文件,比如图片或文本,只需将FileType.pdf
替换为FileType.image
或FileType.text
等。
注意:确保你的设备上已经安装了能够处理相应文件类型的应用,例如PDF阅读器。如果设备上没有相应的应用,file_preview
插件可能无法正常工作。