我正在使用pdf lib生成pdf,并希望将动态表放到颤振中

时间:2019-10-01 07:02:41

标签: flutter dart

我正在尝试在pdf中添加带有循环的动态表,但是它不起作用。

 pdfLib.Table.fromTextArray(
        context: context,
        data: <List<String>>[
          <String>[
            '#',
            'Product Name',
            'HSN',
            'Qty',
            'Unit Price',
            'MRP',
            'Disc%',
            'Disc Amnt',
            'Taxable Amnt',
            'SGST%',
            'SGST Amnt',
            'CGST%',
            'CGST Amnt',
            'Net Amnt'
          ],
          _list(),
        ],
      ),

_list这是一个返回字符串列表的函数,但是它只能在表中添加一行,

for (var i = 0; i < _items.length; i++) {
  return <String>[
    (i + 1).toString(),
    _items[i].title,
    'HSN',
    _items[i].quantity.toString(),
    _items[i].price.toString(),
    _items[i].mrp.toString(),
    _items[i].discount.toString(),
    _item[i].gst,
    _item[i].amount  
    _item[i].sGst,
    _item[i].someitem,
    _item[i].cGst,
    _items[i].price,
    _items[i].quantity];
}

有人可以帮我吗? 谢谢

3 个答案:

答案 0 :(得分:1)

_list需要返回List<List<String>>,因为它需要返回多个字符串列表-每个项目一个。可以使用List.map()来编写,例如:

List<List<String>> _list() {
  return _items
      .map((item) => <String>[
            item.title,
            'HSN',
            item.quantity.toString(),
            // etc
          ])
      .toList();
}

将每个项目映射到一个字符串列表,并返回列表列表。

您需要更改使用此方法的方式,以使用扩展运算符 ...,以便将项目列表扩展为整体列表,如下所示:

  var data = <List<String>>[
    <String>[
      '#',
      'Product Name',
      'HSN',
      'Qty',
      'Unit Price',
      'MRP',
      'Disc%',
      'Disc Amnt',
      'Taxable Amnt',
      'SGST%',
      'SGST Amnt',
      'CGST%',
      'CGST Amnt',
      'Net Amnt'
    ],
    ..._list(),
  ];
}

或者,您可以使用for运算符内联整个操作:

  var data = <List<String>>[
    <String>[
      '#',
      'Product Name',
      'HSN',
      'Qty',
      'Unit Price',
      'MRP',
      'Disc%',
      'Disc Amnt',
      'Taxable Amnt',
      'SGST%',
      'SGST Amnt',
      'CGST%',
      'CGST Amnt',
      'Net Amnt'
    ],
    for (var item in _items)
      <String>[
        item.title,
        'HSN',
        item.quantity.toString(),
        // etc
      ],
  ];
}

答案 1 :(得分:0)

有几种方法可以做到,我更喜欢单独填写列表,例如:

`List<List<String>> salidas = new List();
    salidas.add(<String>['Title1','Title2', ... , 'Title n']);

    for(var indice=0;indice<records.length;indice++) {
       var recind = {
        'field1': records[indice].Stringfield1,
        'field2': records[indice].Stringfield2,
        ...
        'fieldn': records[indice].Stringfieldn
    };
    salidas.add(recind);
    }
 ...
 fpdf.Table.fromTextArray(context: context,data: salidas),
`

答案 2 :(得分:0)

// Generate Dynamic PDF
    _generatePdfAndView(context) async {
      final pw.Document pdf = pw.Document(deflate: zlib.encode);
      pdf.addPage(
        pw.MultiPage(
          build: (context) => [
            pw.Table.fromTextArray(
              context: context,
              data: <List<String>>[
                // These will be your columns as Parameter X, Parameter Y etc.
                <String>[
                  'Parameter',
                  'Price',
                ],
                for (int i = 0; i < featureNames.length; i++)
                  <String>[
                    // ith element will go in ith column means
                    // featureNames[i] in 1st column
                    featureNames[i],
                     // featureValues[i] in 2nd column
                    featureValues[i].toString(),
                  ],
              ],
            ),
          ],
        ),
      );
    }

希望对您有用。