【问题标题】:PDF from Firebase Storage not displayed in Flutter view来自 Firebase 存储的 PDF 未显示在 Flutter 视图中
【发布时间】:2021-07-26 12:37:21
【问题描述】:

当用户点击按钮时,我有这段代码可以显示 pdf。但是,它不起作用。 我没有看到我在这里做错了什么。拜托,你能帮我解决这个问题吗?非常感谢。 我得到了一个新的视图,但视图是空白的。 当文件是本地文件时,它工作正常,我的意思是在我的手机上。但是当pdf在firebase上时,我得到一个空白页。 我已经修改了代码。

我再次修改了代码。但仍然无法正常工作。如果你们中的一个人可以帮助我解决这个问题,我们将不胜感激。我的项目现在被阻止了。这让我发疯了。非常感谢。

//on another page

Navigator.pop(context);
              Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => Display_PDF_Selected_Storage(task_Attachments[j].toString())));

import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:path_provider/path_provider.dart';

class Display_PDF_Selected_Storage extends StatefulWidget {
  final int pdfIndex;
  final String selectedPdfPath;

  Display_PDF_Selected_Storage(this.selectedPdfPath, {Key key, this.pdfIndex, }) : super(key: key);
  @override
  _Display_PDF_Selected_StorageState createState() => _Display_PDF_Selected_StorageState(selectedPdfPath,pdfIndex);
}


class _Display_PDF_Selected_StorageState extends State<Display_PDF_Selected_Storage> {
  PDFViewController controller;

  int indexPage = 0, indexPdf, pages = 0, currentPage = 0;
  bool isReady = false;
  String selectedPdfPath;

  _Display_PDF_Selected_StorageState(this.selectedPdfPath,this.indexPdf,);

  @override
  Widget build(BuildContext context) {
    final text = '${indexPage + 1} of $pages';

    return Scaffold(
      appBar: new AppBar(
        title: new Text(selectedPdfPath.split('/').last),
        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:Stack(
        children: <Widget>[
          PDFView(
            filePath: selectedPdfPath,
            autoSpacing: false,
            swipeHorizontal: true,
            enableSwipe: true,
            pageSnap: false,
            pageFling: true,
            onRender: (pages) => setState(() => this.pages = pages),
            onViewCreated: (controller) =>
                setState(() => this.controller = controller),
            onPageChanged: (indexPage, _) =>
                setState(() => this.indexPage = indexPage),
            //  errorMessage.isEmpty
          ),
        ],
      ),
    );
  }

  Future <String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }

  Future<File> get _localFile async{
    final path = await _localPath;
    return File('$path/guidelines.pdf');
  }

  Future<File> writeToLocal(Uint8List bytes) async {
    final file = await _localFile;
    return file.writeAsBytes(bytes);
  }

}

【问题讨论】:

    标签: flutter pdf


    【解决方案1】:

    我遇到了同样的问题。试试这个小部件:

    import 'dart:io';
    import 'dart:typed_data';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:logger/logger.dart';
    import 'package:path_provider/path_provider.dart';
    import 'package:pilot_dispatch_app/tools/fs_utils.dart';
    import 'package:share/share.dart';
    import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
    
    class PdfFromUrl extends StatefulWidget {
      final String url;
    
      const PdfFromUrl({Key? key, required this.url}) : super(key: key);
      @override
      _PdfFromUrlState createState() => _PdfFromUrlState();
    }
    
    class _PdfFromUrlState extends State<PdfFromUrl> {
      //String pathPDF = "";
      String remotePDFpath = "";
    
      @override
      void initState() {
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return PDFScreen(path: widget.url);
      }
    }
    
    class PDFScreen extends StatefulWidget {
      final String? path;
    
      PDFScreen({Key? key, this.path}) : super(key: key);
    
      _PDFScreenState createState() => _PDFScreenState();
    }
    
    class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver {
      // final Completer<PDFViewController> _controller =
      //     Completer<PDFViewController>();
      int? pages = 0;
      int? currentPage = 0;
      bool isReady = false;
      String errorMessage = '';
      String? getFileName(String? pdfUrl) {
        if (pdfUrl != null) {
          var result = pdfUrl.substring(pdfUrl.lastIndexOf('/') + 1);
          if (result.contains('?')) {
            result = result.substring(0, result.lastIndexOf('?'));
          }
          return result;
        }
      }
    
      @override
      Widget build(BuildContext context) {
        var title = getFileName(widget.path);
        return Scaffold(
          appBar: AppBar(
            automaticallyImplyLeading: true,
            title: Text(title!),
            leading: IconButton(
              icon: Icon(Icons.arrow_back),
              onPressed: () => Navigator.pop(context, false),
            ),
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.share),
                onPressed: () async {
                  try {
                    final pdfUint8List = await FsUtils.getUint8ListFromUrl(
                      widget.path!,
                    );
                    if (pdfUint8List != null) {
                      final file = await writeToLocal(pdfUint8List);
                      Share.shareFiles([file.path]);
                    }
                  } catch (e) {
                    Logger().e(
                      e.toString(),
                    );
                  }
                  //Share.share(widget.path!);
                },
              ),
            ],
          ),
          body: Container(
            child: SfPdfViewer.network(
              widget.path!,
              //'https://cdn.syncfusion.com/content/PDFViewer/flutter-succinctly.pdf',
              enableDocumentLinkAnnotation: false,
            ),
          ),
        );
      }
    }
    
    Future<String> get _localPath async {
      final directory = await getApplicationDocumentsDirectory();
    
      return directory.path;
    }
    
    Future<File> get _localFile async {
      final path = await _localPath;
      return File('$path/guidelines.pdf');
    }
    
    Future<File> writeToLocal(Uint8List bytes) async {
      final file = await _localFile;
      // Write the file
      return file.writeAsBytes(bytes);
    }
    

    【讨论】:

    • 谢谢。我已经尝试过,但无法工作。
    猜你喜欢
    • 2021-02-13
    • 2016-09-28
    • 2021-06-19
    • 1970-01-01
    • 2022-01-19
    • 2018-08-13
    • 2020-04-20
    • 2020-08-01
    • 2016-11-22
    相关资源
    最近更新 更多