我想在我的应用程序中显示一个包含 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,
);
}
Run Code Online (Sandbox Code Playgroud)
稍后在应用程序中:
RaisedButton.icon(onPressed: ostundenplan, icon: Icon(Icons.signal_wifi_off), label: Text('Offline Stundenplan'),),
Run Code Online (Sandbox Code Playgroud)
但它不起作用。谁能帮我?
编辑:
当我像 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.
^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
好像没有找到PDFReader。我能做什么?
编辑2:
顺便说一句,这是我的导航器:
ostundenplan() {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PDFReader()));
}
Run Code Online (Sandbox Code Playgroud)
编辑 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) {},
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
试试这个包flutter_plugin_pdf_viewer。
这对我来说非常好。我将 PDF 文件保存在 firebase 存储中并通过 URL 打开它。
PDFDocument doc = await PDFDocument.fromURL(LINK);
PDFViewer(document: doc)
Run Code Online (Sandbox Code Playgroud)
编辑:
下面的类显示了实现。如果您不需要刷新状态,您甚至可以使用 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);
}
},
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您只需要导航到 PDFReader 小部件。如果您想将 PDF 数据从一个屏幕传递到另一个屏幕,您也可以这样做,而不是在 PDFReader 屏幕中对其进行硬编码。
CenterCircularProgressBar() 是一个自定义小部件,它在屏幕中央显示一个圆形进度条,直到加载 PDF,CenterText 是一个自定义小部件,如果我们没有从 PDFDocument.fromURL 获取数据,它会显示错误。代码如下。
所以在这一行
PDFDocument.fromURL('http://www.africau.edu/images/default/sample.pdf')
Run Code Online (Sandbox Code Playgroud)
您可以使用 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,
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
466 次 |
| 最近记录: |