Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用
Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用
flutter_fullpdfview_fork
原生PDF视图插件,适用于iOS和Android平台。基于https://github.com/arnaudelub/flutter_fullpdfview。
使用此插件作为库
1. 添加依赖
在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter_fullpdfview_fork: latest_version
2. 安装依赖
你可以通过命令行安装包:
用Flutter:
$ flutter packages get
或者,你可以使用编辑器支持的pub get
或flutter pub get
功能。具体方法取决于你的编辑器。
3. 配置
iOS
在应用的Info.plist
文件中添加一个布尔属性,键名为io.flutter.embedded_views_preview
,值为YES
。
4. 导入插件
在你的Dart代码中导入插件:
import 'package:flutter_fullpdfview_fork/flutter_fullpdfview_fork.dart';
参数选项
名称 | Android | iOS |
---|---|---|
onViewCreated | V | V |
onRender | V | V |
onPageChanged | V | V |
onError | V | V |
onPageError | V | X |
gestureRecognizers | V | V |
filePath | V | V |
fitEachPage | V | V |
defaultPage | V | V |
dualPageMode | V | V |
displayAsBook | V | V |
dualPageWithBreak | V | V |
enableSwipe | V | V |
swipeHorizontal | V | V |
password | V | V |
nightMode | V | X |
autoSpacing | V | V |
pageFling | V | V |
pageSnap | V | V |
backgroundColor | V | V |
fitPolicy | V | X |
目前只支持黑白模式!
控制器选项
名称 | 描述 | 参数 | 返回类型 |
---|---|---|---|
getPageCount | 获取总页数 | - | Future<int> |
getCurrentPage | 获取当前页 | - | Future<int> |
setPage | 跳转到指定页 | int page |
Future<bool> |
setPageWithAnimation | 带动画跳转到指定页 | int page |
Future<bool> |
resetZoom | 跳转到指定页并适应宽度 | int page |
Future<bool> |
getZoom | 获取当前缩放比例 | double zoom |
Future<double> |
setZoom | 设置当前缩放比例 | double zoom |
Future<double> |
getPageWidth | 获取PDF宽度 | double width |
Future<double> |
getPageHeight | 获取PDF高度 | double height |
Future<double> |
示例
以下是使用flutter_fullpdfview_fork
插件的完整示例代码:
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_fullpdfview_fork/flutter_fullpdfview_fork.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String pathPDF = "";
String corruptedPathPDF = "";
[@override](/user/override)
void initState() {
super.initState();
fromAsset('assets/corrupted.pdf', 'corrupted.pdf').then((f) {
setState(() {
corruptedPathPDF = f.path;
});
});
fromAsset('assets/demo.pdf', 'sample.pdf').then((f) {
setState(() {
pathPDF = f.path;
});
});
}
Future<File> createFileOfPdfUrl() async {
final url = "https://pdfkit.org/docs/guide.pdf";
final filename = url.substring(url.lastIndexOf("/") + 1);
var request = await HttpClient().getUrl(Uri.parse(url));
var response = await request.close();
var bytes = await consolidateHttpClientResponseBytes(response);
String dir = (await getApplicationDocumentsDirectory()).path;
File file = File('$dir/$filename');
await file.writeAsBytes(bytes);
return file;
}
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 parsing asset file!');
}
return completer.future;
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter PDF View',
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: const Text('Plugin example app')),
body: Center(child: Builder(
builder: (BuildContext context) {
return Column(
children: <Widget>[
RaisedButton(
child: Text("Open PDF"),
onPressed: () {
if (pathPDF != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PDFScreen(path: pathPDF)),
);
}
}),
RaisedButton(
child: Text("Open Corrupted PDF"),
onPressed: () {
if (pathPDF != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
PDFScreen(path: corruptedPathPDF)),
);
}
})
],
);
},
)),
),
);
}
}
class PDFScreen extends StatefulWidget {
final String path;
PDFScreen({Key? key, required this.path}) : super(key: key);
_PDFScreenState createState() => _PDFScreenState();
}
class _PDFScreenState extends State<PDFScreen> {
int pages = 0;
bool isReady = false;
String errorMessage = '';
GlobalKey pdfKey = GlobalKey();
bool isActive = true;
double scale = 1.0;
double top = 200.0;
double initialLocalFocalPoint = 0;
[@override](/user/override)
Widget build(BuildContext context) {
return OrientationBuilder(
builder: (BuildContext context, Orientation orientation) {
if (orientation == Orientation.portrait) {
final Completer<PDFViewController> _controller =
Completer<PDFViewController>();
return Scaffold(
appBar: AppBar(
title: Text("Document"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.share),
onPressed: () {},
),
],
),
body: Stack(
children: <Widget>[
Container(
color: Colors.black,
child: PDFView(
key: pdfKey,
filePath: widget.path,
fitEachPage: true,
fitPolicy: FitPolicy.BOTH,
dualPageMode: false,
enableSwipe: true,
swipeHorizontal: true,
autoSpacing: true,
pageFling: true,
defaultPage: 8,
pageSnap: true,
backgroundColor: Colors.BLACK,
onRender: (_pages) {
print("OK RENDERED!!!!!");
setState(() {
pages = _pages;
isReady = true;
});
},
onError: (error) {
setState(() {
errorMessage = error.toString();
});
print(error.toString());
},
onPageError: (page, error) {
setState(() {
errorMessage = '$page: ${error.toString()}';
});
print('$page: ${error.toString()}');
},
onViewCreated: (PDFViewController pdfViewController) {
_controller.complete(pdfViewController);
},
onPageChanged: (int page, int total) {
print('page change: $page/$total');
},
onZoomChanged: (double zoom) {
print("Zoom is now $zoom");
}),
),
errorMessage.isEmpty
? !isReady
? Center(
child: CircularProgressIndicator(),
)
: Container()
: Center(child: Text(errorMessage))
],
),
floatingActionButton: FutureBuilder<PDFViewController>(
future: _controller.future,
builder: (context, AsyncSnapshot<PDFViewController> snapshot) {
if (snapshot.hasData) {
return FloatingActionButton.extended(
label: Text("Go to ${pages ~/ 2}"),
onPressed: () async {
print(await snapshot.data?.getZoom());
print(await snapshot.data?.getPageWidth(1));
print(await snapshot.data?.getPageHeight(1));
//await snapshot.data.setPage(pages ~/ 2);
await snapshot.data?.resetZoom(1);
await snapshot.data?.setZoom(3.0);
//print(await snapshot.data.getScreenWidth());
},
);
}
return Container();
},
),
);
} else {
final Completer<PDFViewController> _controller =
Completer<PDFViewController>();
return PDFView(
filePath: widget.path,
fitEachPage: false,
dualPageMode: true,
displayAsBook: true,
dualPageWithBreak: true,
enableSwipe: true,
swipeHorizontal: true,
autoSpacing: false,
pageFling: true,
defaultPage: 0,
pageSnap: true,
backgroundColor: Colors.BLACK,
onRender: (_pages) {
print("OK RENDERED!!!!!");
setState(() {
pages = _pages;
isReady = true;
});
},
onError: (error) {
setState(() {
errorMessage = error.toString();
});
print(error.toString());
},
onPageError: (page, error) {
setState(() {
errorMessage = '$page: ${error.toString()}';
});
print('$page: ${error.toString()}');
},
onViewCreated: (PDFViewController pdfViewController) {
_controller.complete(pdfViewController);
},
onPageChanged: (int page, int total) {
print('page change: $page/$total');
},
);
}
});
}
}
更多关于Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_fullpdfview_fork
是一个用于在 Flutter 应用中全屏查看 PDF 文件的插件。它是 flutter_fullpdfview
的一个分支版本,提供了一些额外的功能和改进。以下是使用 flutter_fullpdfview_fork
的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_fullpdfview_fork
依赖:
dependencies:
flutter:
sdk: flutter
flutter_fullpdfview_fork: ^1.0.0+17
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 flutter_fullpdfview_fork
包:
import 'package:flutter_fullpdfview_fork/flutter_fullpdfview_fork.dart';
3. 使用 PDFView 组件
使用 PDFView
组件来显示 PDF 文件。你可以从本地文件系统或网络加载 PDF 文件。
从本地文件加载 PDF
class PDFViewerPage extends StatelessWidget {
final String path;
PDFViewerPage({required this.path});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PDF Viewer'),
),
body: PDFView(
filePath: path,
),
);
}
}
从网络加载 PDF
class PDFViewerPage extends StatelessWidget {
final String url;
PDFViewerPage({required this.url});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PDF Viewer'),
),
body: PDFView(
filePath: url,
),
);
}
}
4. 导航到 PDFViewerPage
你可以在应用的其他部分导航到 PDFViewerPage
来显示 PDF 文件。
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PDFViewerPage(path: 'assets/sample.pdf'),
),
);
5. 可选配置
PDFView
组件提供了一些可选配置项,你可以根据需要自定义 PDF 查看器。
例如,你可以设置是否启用滚动、缩放、页面切换等:
PDFView(
filePath: path,
enableSwipe: true,
swipeHorizontal: false,
autoSpacing: true,
pageFling: true,
onRender: (_pages) {
print("PDF rendered with $_pages pages");
},
onError: (error) {
print(error.toString());
},
onPageError: (page, error) {
print('$page: ${error.toString()}');
},
onViewCreated: (PDFViewController pdfViewController) {
// You can store the controller for further use
},
onPageChanged: (int page, int total) {
print('page change: $page/$total');
},
);
6. 处理权限
如果你从网络加载 PDF 文件,确保你的应用有访问网络的权限。在 AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />