fluttertpc_flutter_pdfview 在鸿蒙上的使用指南
《Flutter鸿蒙PDF查看插件fluttertpc_flutter_pdfview使用指南》摘要: 该插件是基于flutter_pdfview@1.3.3适配鸿蒙平台的PDF查看解决方案,支持本地/远程PDF加载、页面导航、缩放、密码保护等功能。通过Git方式引入依赖后,开发者可轻松实现PDF文档展示功能。示例代码展示了从assets加载PDF、显示加载状态、处理错误以及页面跳转等核心功能,提
1. 插件介绍
fluttertpc_flutter_pdfview 是一个专为 Flutter 应用开发的 PDF 文档查看插件,特别适配了鸿蒙(HarmonyOS)平台。该插件基于 flutter_pdfview@1.3.3 版本进行鸿蒙化适配,允许开发者在 Flutter 应用中轻松实现 PDF 文档的加载、渲染和交互功能。

主要功能特点:
- 支持本地 PDF 文件加载
- 支持远程 PDF 文件下载与显示
- 提供页面导航、缩放、翻页等基本 PDF 浏览功能
- 支持密码保护的 PDF 文档
- 提供丰富的回调事件(页面加载完成、翻页、错误处理等)
- 支持自定义 PDF 视图的各种属性
2. 如何使用插件
2.1 包的引入
由于这是一个专为鸿蒙平台适配的自定义修改版本,需要通过 Git 形式引入依赖。在项目的 pubspec.yaml 文件中添加以下配置:
dependencies:
flutter:
sdk: flutter
flutter_pdfview_ohos:
git:
url: https://gitcode.com/openharmony-sig/fluttertpc_flutter_pdfview.git
path: ohos
path_provider:
git:
url: https://gitcode.com/openharmony-tpc/flutter_packages.git
path: packages/path_provider/path_provider
添加依赖后,执行以下命令获取包:
flutter pub get
2.2 导入并使用插件
在 Dart 代码中导入插件:
import 'package:flutter_pdfview_ohos/flutter_pdfview_ohos.dart';
3. API 的调用
3.1 基本用法示例
下面是一个完整的示例,展示如何加载并显示 PDF 文件:
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_pdfview_ohos/flutter_pdfview_ohos.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'PDF Viewer Example',
home: PDFScreen(),
);
}
}
class PDFScreen extends StatefulWidget {
_PDFScreenState createState() => _PDFScreenState();
}
class _PDFScreenState extends State<PDFScreen> {
String? pathPDF;
final Completer<PDFViewController> _controller = Completer<PDFViewController>();
int? pages = 0;
int? currentPage = 0;
bool isReady = false;
String errorMessage = '';
void initState() {
super.initState();
// 从 assets 复制 PDF 文件到应用目录
fromAsset('assets/sample.pdf', 'sample.pdf').then((file) {
setState(() {
pathPDF = file.path;
});
});
}
// 从 assets 复制文件到应用目录
Future<File> fromAsset(String asset, String filename) async {
Completer<File> completer = Completer();
try {
var dir = await getApplicationDocumentsDirectory();
File file = File("${dir.path}/$filename");
var data = await rootBundle.load(asset);
var bytes = data.buffer.asUint8List();
await file.writeAsBytes(bytes, flush: true);
completer.complete(file);
} catch (e) {
throw Exception('Error loading PDF asset!');
}
return completer.future;
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("PDF 查看器"),
),
body: pathPDF != null
? Stack(
children: <Widget>[
PDFView(
filePath: pathPDF,
enableSwipe: true,
defaultPage: currentPage!, // 默认显示的页面
fitPolicy: FitPolicy.WIDTH, // 自适应宽度
onRender: (_pages) {
// PDF 渲染完成回调
setState(() {
pages = _pages;
isReady = true;
});
},
onError: (error) {
// 加载错误回调
setState(() {
errorMessage = error.toString();
});
},
onPageError: (page, error) {
// 页面加载错误回调
setState(() {
errorMessage = '$page: ${error.toString()}';
});
},
onViewCreated: (PDFViewController pdfViewController) {
// PDF 视图创建完成回调
_controller.complete(pdfViewController);
},
onPageChanged: (int? page, int? total) {
// 页面切换回调
setState(() {
currentPage = page;
});
},
),
// 加载状态指示器
!isReady
? Center(
child: CircularProgressIndicator(),
)
: Container(),
// 错误信息显示
errorMessage.isNotEmpty
? Center(
child: Text(errorMessage),
)
: Container()
],
)
: Center(
child: CircularProgressIndicator(),
),
// PDF 控制器示例
floatingActionButton: FutureBuilder<PDFViewController>(
future: _controller.future,
builder: (context, snapshot) {
if (snapshot.hasData) {
return FloatingActionButton.extended(
label: Text("跳转到第 ${pages! ~/ 2} 页"),
onPressed: () async {
// 使用控制器跳转到指定页面
await snapshot.data!.setPage(pages! ~/ 2);
},
);
}
return Container();
},
),
);
}
}
3.2 核心 API 说明
3.2.1 PDFView 组件属性
| 属性名 | 描述 | 类型 | 鸿蒙支持情况 |
|---|---|---|---|
| filePath | PDF 文件路径 | String? | ✅ |
| enableSwipe | 是否启用滑动翻页 | bool | ✅ |
| defaultPage | 默认显示的页面 | int | ✅ |
| fitPolicy | PDF 自适应策略 | FitPolicy | ✅ |
| password | PDF 文档密码 | String? | ✅ |
| preventLinkNavigation | 是否阻止链接导航 | bool | ✅ |
| onRender | PDF 渲染完成回调 | Function(int?) | ✅ |
| onError | 加载错误回调 | Function(dynamic) | ✅ |
| onPageError | 页面加载错误回调 | Function(int?, dynamic) | ✅ |
| onViewCreated | 视图创建完成回调 | Function(PDFViewController) | ✅ |
| onPageChanged | 页面切换回调 | Function(int?, int?) | ✅ |
3.2.2 PDFViewController 控制器方法
| 方法名 | 描述 | 参数 | 返回值 |
|---|---|---|---|
| getPageCount | 获取总页数 | - | Future<int?> |
| getCurrentPage | 获取当前页码 | - | Future<int?> |
| setPage | 跳转到指定页面 | int page | Future<bool?> |
3.3 鸿蒙平台已知限制
需要注意的是,鸿蒙平台上的实现与其他平台相比有一些限制:
- 不支持直接通过
pdfData加载二进制 PDF 数据 swipeHorizontal属性在鸿蒙平台上无效nightMode属性在鸿蒙平台上无效autoSpacing属性在鸿蒙平台上无效pageFling和pageSnap属性在鸿蒙平台上无效
4. 总结
fluttertpc_flutter_pdfview 是一个功能强大的 PDF 查看插件,经过鸿蒙平台适配后,能够满足 Flutter 应用在鸿蒙设备上的 PDF 文档浏览需求。通过简单的配置和 API 调用,开发者可以轻松实现专业的 PDF 查看功能。
虽然在鸿蒙平台上存在一些功能限制,但核心的 PDF 浏览功能都已得到支持,足以满足大多数应用场景的需求。随着鸿蒙生态的不断发展,这些限制也有望在未来的版本中得到解决。
5. 加入社区
欢迎加入开源鸿蒙跨平台社区,与更多开发者交流学习:
https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)