你好,我是新来的扑动。当我计算这个运算时,我的代码中出现了这个错误。我已经在pubspec中导入了所有依赖项。yaml文件。请帮帮我。
误差
Null检查操作符
fileview.dart
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:offlinefileviewer/pdfapi.dart';
import 'package:offlinefileviewer/pdfviewerpage.dart';
class FileView extends StatelessWidget {
const FileView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("File viewer"),
),
body: ElevatedButton(
onPressed: () async {
final path = 'assets/pdf1.pdf';
final file = await PdfApi.loadAsset(path);
openPDF(context, file);
},
child: Text("Asset File"),
),
);
}
void openPDF(BuildContext context, File file) =>
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => PDFViewerPage(key: key!, file: file)),
);
}
pdfviewerpage.dart
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:path/path.dart';
class PDFViewerPage extends StatefulWidget {
final File? file;
const PDFViewerPage({
Key? key,
this.file,
}) : super(key: key);
@override
_PDFViewerPageState createState() => _PDFViewerPageState();
}
class _PDFViewerPageState extends State<PDFViewerPage> {
PDFViewController? controller;
int? pages;
int? indexPage;
@override
Widget build(BuildContext context) {
final name = basename(widget.file!.path);
final text = '${indexPage! + 1} of $pages';
return Scaffold(
appBar: AppBar(
title: Text(name),
actions: pages! >= 2
? [
Center(child: Text(text)),
IconButton(
icon: Icon(Icons.chevron_left, size: 32),
onPressed: () {
final page = indexPage == 0 ? pages : indexPage! - 1;
controller!.setPage(page!);
},
),
IconButton(
icon: Icon(Icons.chevron_right, size: 32),
onPressed: () {
final page = indexPage == pages! - 1 ? 0 : indexPage! + 1;
controller!.setPage(page);
},
),
]
: null,
),
body: PDFView(
filePath: widget.file!.path,
onRender: (pages) => setState(() => this.pages = pages!),
onViewCreated: (controller) =>
setState(() => this.controller = controller),
onPageChanged: (indexPage, _) =>
setState(() => this.indexPage = indexPage!),
),
);
}
}
误差
════════例外被小部件库═══════════════════════════════════下面的_CastError在构建Builder(dirty)时抛出:用于空值
的空检查操作符The relevant error-causing widget was
MaterialApp
libmain.dart:12
When the exception was thrown, this was the stack
#0 FileView.openPDF.<anonymous closure>
package:offlinefileviewer/fileview.dart:28
#1 MaterialPageRoute.buildContent
package:flutter/…/material/page.dart:53
#2 MaterialRouteTransitionMixin.buildPage
package:flutter/…/material/page.dart:106
#3 _ModalScopeState.build.<anonymous closure>.<anonymous closure>
package:flutter/…/widgets/routes.dart:843
#4 Builder.build
package:flutter/…/widgets/basic.dart:7798
...
════════════════════════════════════════════════════════════════════════════════
尽可能避免使用可空变量。因此,它将是安全的和可预测的分析器本身。
- 尽可能避免使用
!
操作符。看到这个。
但是,您应该能够用if
条件包装对可空变量的每次访问,以避免在它为空时继续访问。当使用!
时,严格建议使用某种检查(最好使用if
条件来查看值是否为空,或者做一些当值为空时预期要做的事情)
class PDFViewerPage extends StatefulWidget {
final File file;
const PDFViewerPage({
Key? key,
required this.file,
}) : super(key: key);
@override
_PDFViewerPageState createState() => _PDFViewerPageState();
}
class _PDFViewerPageState extends State<PDFViewerPage> {
PDFViewController? controller;
int? pages;
int? indexPage;
late final String name;
String get text => '${indexPage ?? 0 + 1} of ${pages ?? 0}';
@override
void initState() {
name = basename(widget.file.path);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(name),
actions: (pages ?? 0) >= 2 // edited
? [
Center(child: Text(text)),
IconButton(
icon: Icon(Icons.chevron_left, size: 32),
onPressed: () {
if (controller == null || pages == null) {
return;
}
final page =
(indexPage ?? 0) == 0 ? pages! : indexPage! - 1;
controller!.setPage(page);
},
),
IconButton(
icon: Icon(Icons.chevron_right, size: 32),
onPressed: () {
if (controller == null || pages == null) {
return;
}
final page = (indexPage ?? 0) == pages! - 1
? 0
: (indexPage ?? 0) + 1;
controller?.setPage(page);
},
),
]
: null,
),
body: PDFView(
filePath: widget.file.path,
onRender: (pages) => setState(() => this.pages = pages!),
onViewCreated: (controller) =>
setState(() => this.controller = controller),
onPageChanged: (indexPage, _) =>
setState(() => this.indexPage = indexPage!),
),
);
}
}
- 在您的
fileview.dart
方法openPdf
中,key
可以为空。在运行时,它碰巧是一个空值,并且使用了!
操作符,导致它抛出该异常。
只要去掉!
运算符,就可以解决这个问题,因为PDFViewerPage
也接受一个可空的key
参数。
这可能有帮助:
void openPDF(BuildContext context, File file) =>
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => PDFViewerPage(key: key, file: file)),
);
- 删除async并尝试下面的代码
ElevatedButton( onPressed: () =>openPDF(context, file), child: Text("Asset File"), ) void openPDF(BuildContext context, File file) { final path = 'assets/pdf1.pdf'; final file = await PdfApi.loadAsset(path); Navigator.of(context).push(MaterialPageRoute(builder: (_) =>PDFViewerPage(key: key!, file: file))); }