簡體   English   中英

Flutter 錯誤 - Null 檢查運算符用於 null 值(PDF 查看器)

[英]Flutter Error - Null check operator used on null value (PDF viewer)

你好,我是 Flutter 的新人。當我計算這個操作時,我的代碼中出現了這個錯誤。 我已將所有依賴項導入到我的 pubspec.yaml 文件中。 請幫我。

錯誤

Null 檢查用於 null 值的運算符

文件視圖.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!),
      ),
    );
  }
}

錯誤

════════異常被widgets庫捕獲═════════════════════════════════ _CastError was throwed building Builder(dirty): Null check operator used on a null value

The relevant error-causing widget was
MaterialApp
lib\main.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條件包裝對可空變量的每次訪問,以避免在它為 null 時繼續。當使用! 強烈建議使用某種檢查(最好使用if條件來查看值是否為 null,否則執行一些預期在值為 null 時執行的操作)

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可以是 null。在運行時,它恰好是一個 null 值,並且! 使用了運算符導致它拋出該異常。

只需刪除! 運算符,可以解決問題,因為PDFViewerPage也接受可為空的key參數。

這可以幫助:

  void openPDF(BuildContext context, File file) => 
        Navigator.of(context).push(
        MaterialPageRoute(builder: (_) => PDFViewerPage(key: key, file: file)),
      );
  • 刪除異步並嘗試下面的代碼
     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))); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM