le type 'Future <Uint8List>' n'est pas un sous-type de type 'Widget'

Aug 18 2020

J'essaie d'afficher un pdf en utilisant ce bouton dans mon application Flutter mais je continue à recevoir l'erreur dans le titre

  AppButton.buildAppButton(
                  context,
                  AppButtonType.TEXT_OUTLINE,
                  'Generate PDF',
                  Dimens.BUTTON_BOTTOM_DIMENS, onPressed: () {
                Sheets.showAppHeightEightSheet(
                context: context,
                  widget: work(),
                );
              })

Ceci est mon widget de travail

      Widget work() {
       dynamic pdf =  generateInvoice(PdfPageFormat.a4);
       return pdf;
     }

qui appelle cette fonction. Cependant, je continue à obtenir le type d'erreur de titre «Future» n'est pas un sous-type de type «Widget». Toute aide est appréciée. L'objectif final est de visualiser le pdf mais je ne sais pas comment y arriver. Merci!

Future<Uint8List> generateInvoice(PdfPageFormat pageFormat) async {
  final lorem = pw.LoremText();

  final products = <Product>[
    Product('19874', lorem.sentence(4), 3.99, 2),
    Product('98452', lorem.sentence(6), 15, 2),
    Product('28375', lorem.sentence(4), 6.95, 3),
    Product('95673', lorem.sentence(3), 49.99, 4),
    Product('23763', lorem.sentence(2), 560.03, 1),
    Product('55209', lorem.sentence(5), 26, 1),
    Product('09853', lorem.sentence(5), 26, 1),
   
  ];

  final invoice = Invoice(
    invoiceNumber: '982347',
    products: products,
    customerName: 'Abraham Swearegin',
    customerAddress: '54 rue de Rivoli\n75001 Paris, France',
    paymentInfo:
        '4509 Wiseman Street\nKnoxville, Tennessee(TN), 37929\n865-372-0425',
    tax: .15,
    baseColor: PdfColors.teal,
    accentColor: PdfColors.blueGrey900,
  );

  return await invoice.buildPdf(pageFormat);
}

class Invoice {
  Invoice({
    this.products,
    this.customerName,
    this.customerAddress,
    this.invoiceNumber,
    this.tax,
    this.paymentInfo,
    this.baseColor,
    this.accentColor,
  });

  final List<Product> products;
  final String customerName;
  final String customerAddress;
  final String invoiceNumber;


  static const _darkColor = PdfColors.blueGrey800;
  static const _lightColor = PdfColors.white;

  PdfColor get _baseTextColor =>
      baseColor.luminance < 0.5 ? _lightColor : _darkColor;

  PdfColor get _accentTextColor =>
      baseColor.luminance < 0.5 ? _lightColor : _darkColor;

  double get _total =>
      products.map<double>((p) => p.total).reduce((a, b) => a + b);

  double get _grandTotal => _total * (1 + tax);

  PdfImage _logo;

  Future<Uint8List> buildPdf(PdfPageFormat pageFormat) async {
    // Create a PDF document.
    final doc = pw.Document();

    final font1 = await rootBundle.load('assets/roboto1.ttf');
    final font2 = await rootBundle.load('assets/roboto2.ttf');
    final font3 = await rootBundle.load('assets/roboto3.ttf');

    _logo = PdfImage.file(
      doc.document,
      bytes: (await rootBundle.load('assets/logo.png')).buffer.asUint8List(),
    );

    // Add page to the PDF
    doc.addPage(
      pw.MultiPage(
        pageTheme: _buildTheme(
          pageFormat,
          font1 != null ? pw.Font.ttf(font1) : null,
          font2 != null ? pw.Font.ttf(font2) : null,
          font3 != null ? pw.Font.ttf(font3) : null,
        ),
        header: _buildHeader,
        footer: _buildFooter,
        build: (context) => [
          _contentHeader(context),
          _contentTable(context),
          pw.SizedBox(height: 20),
          _contentFooter(context),
          pw.SizedBox(height: 20),
          _termsAndConditions(context),
        ],
      ),
    );

    // Return the PDF file content
    return doc.save();
  }

EDIT :: J'essaye de le faire maintenant mais j'obtiens un soulignement rouge sous la ligne commentée

   class MyWidget extends StatelessWidget {
  @override
  Widget build(context) {
    return FutureBuilder<Uint8List>(
        future:  generateInvoice(PdfPageFormat.a4),
        builder: (context, AsyncSnapshot<Uint8List> snapshot) {
          if (snapshot.hasData) {
            return snapshot.data;  //get a red underline here
          } else {
            return CircularProgressIndicator();
          }
        }
    );
  }
}

Réponses

1 TipuSultan Aug 18 2020 at 10:41

Votre fonction de travail devrait ressembler à ceci. Voici deux paquets supplémentaires que j'ai utilisés. Pour afficher le pdf flutter_pdfview et pour enregistrer le pdf temporaire path_provider .

Future<Widget> work() async{
       Uint8List pdf = await generateInvoice(PdfPageFormat.a4);
       File file = await getPdf(pdf);
       return PDFView(
          filePath: file.path,
          autoSpacing: false,
          pageFling: false,
        );
     }

ÉDITÉ:

Future<File> getPdf(Uint8List pdf) async{
    Directory output = await getTemporaryDirectory();
    file = File(output.path+"/name_of_the_pdf.pdf");
    await file.writeAsBytes(pdf);
    return file;
  }

Maintenant, mettez à jour votre méthode de construction comme

@override
  Widget build(context) {
    return FutureBuilder<Widget>(
        future:  work(),
        builder: (BuildContext context, AsyncSnapshot<Widget> snapshot) {
          if (snapshot.hasData) {
            return snapshot.data;  //get a red underline here
          } else {
            return CircularProgressIndicator();
          }
        }
    );
  }