颤振错误-空值上使用的空检查操作符(PDF查看器)



你好,我是新来的扑动。当我计算这个运算时,我的代码中出现了这个错误。我已经在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
...
════════════════════════════════════════════════════════════════════════════════

尽可能避免使用可空变量。因此,它将是安全的和可预测的分析器本身。

  1. 尽可能避免使用!操作符。看到这个。

但是,您应该能够用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!),
),
);
}
}
  1. 在您的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)));
    }
    

最新更新