flutter - 如何将 native_pdf_view 集成到我的应用程序中(颤振)?
问题描述
我想在我的应用程序中显示一个带有 native_pdf_view ( https://pub.dev/packages/native_pdf_view ) 包的 PDF 文件。
我试过这样:
class OStundenplan extends StatelessWidget {
final pdfController = PdfController(
document: PdfDocument.openAsset('assets/stundenplan.pdf'),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Offline Stundenplan'),
),
body: Builder(builder: (BuildContext context) {
return PdfView(controller: _pdfController);
}));
}
}
ostundenplan() {
Navigator.push(
context,
MaterialPageRoute(
Widget pdfView() => PdfView(
controller: pdfController,
);
}
稍后在应用程序中:
RaisedButton.icon(onPressed: ostundenplan, icon: Icon(Icons.signal_wifi_off), label: Text('Offline Stundenplan'),),
但它不起作用。谁能帮我?
编辑:
当我像 pradyot1996 所说的那样尝试时,我得到了这个:
Compiler message:
lib/main.dart:315:37: Error: Type 'PDFReader' not found.
class _PDFReaderState extends State<PDFReader> {
^^^^^^^^^
lib/main.dart:315:7: Error: Type argument 'invalid-type' doesn't conform to the bound 'StatefulWidget' of the type variable 'T' on 'State' in the supertype 'State' of class '_PDFReaderState'.
- 'StatefulWidget' is from 'package:flutter/src/widgets/framework.dart' ('/C:/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try changing type arguments so that they conform to the bounds.
class _PDFReaderState extends State<PDFReader> {
^
/C:/flutter/packages/flutter/lib/src/widgets/framework.dart:1029:22: Context: This is the type variable whose bound isn't conformed to.
abstract class State<T extends StatefulWidget> with Diagnosticable {
^
Compiler message:
lib/main.dart:315:37: Error: Type 'PDFReader' not found.
class _PDFReaderState extends State<PDFReader> {
^^^^^^^^^
lib/main.dart:315:7: Error: Type argument 'invalid-type' doesn't conform to the bound 'StatefulWidget' of the type variable 'T' on 'State' in the supertype 'State' of class '_PDFReaderState'.
- 'StatefulWidget' is from 'package:flutter/src/widgets/framework.dart' ('/C:/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try changing type arguments so that they conform to the bounds.
class _PDFReaderState extends State<PDFReader> {
^
/C:/flutter/packages/flutter/lib/src/widgets/framework.dart:1029:22: Context: This is the type variable whose bound isn't conformed to.
abstract class State<T extends StatefulWidget> with Diagnosticable {
^
Target kernel_snapshot failed: Exception: Errors during snapshot creation: null
build failed.
^^^^^^^^^^
好像没PDFReader
找到 我能做些什么?
编辑2:
顺便说一句,这是我的导航器:
ostundenplan() {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PDFReader()));
}
编辑 3:
class PDFReader extends StatefulWidget {
static const route_name = 'pdf_reader';
@override
_PDFReaderState createState() => _PDFReaderState();
}
class _PDFReaderState extends State<PDFReader> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Offline Stundenplan'),
),
body: FutureBuilder(
future: PDFDocument.fromAsset('assets/stundenplan.pdf'),
builder: (_, pdfData) {},
),
);
}
}
解决方案
试试这个包flutter_plugin_pdf_viewer。
这对我来说非常好。我将 PDF 文件保存在 firebase 存储中并通过 URL 打开它。
PDFDocument doc = await PDFDocument.fromURL(LINK);
PDFViewer(document: doc)
编辑:
下面的类显示了实现。如果您不需要刷新状态,您甚至可以使用 StatelessWidget 类。
class PDFReader extends StatefulWidget {
static const route_name = 'pdf_reader';
@override
_PDFReaderState createState() => _PDFReaderState();
}
class _PDFReaderState extends State<PDFReader> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Document'),
),
body: FutureBuilder(
future: PDFDocument.fromURL('http://www.africau.edu/images/default/sample.pdf'),
builder: (_, pdfData) {
if (pdfData.connectionState == ConnectionState.waiting) {
return CenterCircularProgressBar();
} else if (pdfData.data == null) {
return CenterText('Not able to open PDF file');
} else {
return PDFViewer(document: pdfData.data);
}
},
),
);
}
}
现在您只需要导航到 PDFReader 小部件。如果您想将 PDF 数据从一个屏幕传递到另一个屏幕,您也可以这样做,而不是在 PDFReader 屏幕中对其进行硬编码。
CenterCircularProgressBar() 是一个自定义小部件,它在屏幕中央显示一个圆形进度条,直到加载 PDF,CenterText 是一个自定义小部件,如果我们没有从 PDFDocument.fromURL 获取数据,它会显示错误。代码如下。
所以在这一行
PDFDocument.fromURL('http://www.africau.edu/images/default/sample.pdf')
您可以使用 PDFDocument 提供的 fromAsset、fromURL 和 fromFile 方法来显示 PDF。PDFViewer 是处理 PDF 视图的包提供的自定义类。
class CenterCircularProgressBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const Center(
child: CircularProgressIndicator(),
);
}
}
class CenterText extends StatelessWidget {
final String stringValue;
CenterText(this.stringValue);
@override
Widget build(BuildContext context) {
return Center(
child: Text(
stringValue,
),
);
}
}
推荐阅读
- javascript - 如何在外部 js 文件中使用点击事件监听器而不是内联
- java - 解析对复杂 DTO 的响应?
- javascript - Mongoose 按子条件查找文档
- java - How to Read a Large File Efficiently with Java/android
- mysql - Column that starts with AST and ends in only number
- python - Plotly Dash children= clause
- c# - C# Selenium 查找 XPath 时遇到问题
- javascript - 如何为我的 React 应用程序创建对计算机功能的游戏
- ios - iOS 13 NSKeyedUnarchiver EXC_BAD_ACCESS
- discord.py - 如何让机器人在程序关闭时发送消息