captureImages<T> static method

Future<List<Uint8List>> captureImages<T>(
  1. List<T> products,
  2. BuildContext context, {
  3. required Widget itemBuilder(
    1. T product,
    2. Dimensions dimensions
    ),
  4. required int quantity(
    1. T product
    ),
  5. LabelPerRow labelPerRow = LabelPerRow.doubleLabels,
  6. double spacer = 60,
})

Implementation

static Future<List<Uint8List>> captureImages<T>(
  List<T> products,
  BuildContext context, {
  required Widget Function(
    T product,
    Dimensions dimensions,
  ) itemBuilder,
  required int Function(T product) quantity,
  LabelPerRow labelPerRow = LabelPerRow.doubleLabels,
  double spacer = 60,
}) async {
  Dimensions dimensions = labelPerRow == LabelPerRow.single
      ? Dimensions.large
      : Dimensions.defaultDimens;

  final int itemsPerRow = labelPerRow.count;
  final List<Uint8List> images = [];
  final List<T> expandedProducts = [];

  for (var product in products) {
    for (int i = 0; i < quantity(product); i++) {
      expandedProducts.add(product);
    }
  }

  final List<List<T>> groupedProducts = [];
  for (int i = 0; i < expandedProducts.length; i++) {
    if (i % itemsPerRow == 0) {
      groupedProducts.add([]);
    }
    groupedProducts.last.add(expandedProducts[i]);
  }

  for (var row in groupedProducts) {
    final List<Widget> productWidgets = [];

    for (int i = 0; i < row.length; i++) {
      productWidgets.add(
        itemBuilder(row[i], dimensions),
      );

      if (i < row.length - 1) {
        productWidgets.add(SizedBox(width: spacer));
      }
    }

    final itemsToAdd = itemsPerRow - row.length;
    for (int i = 0; i < itemsToAdd; i++) {
      productWidgets.add(
        SizedBox(
          width: dimensions.width + spacer,
          height: dimensions.height,
        ),
      );
    }

    final rowWidget = Row(children: productWidgets);

    final imageBytes = await ScreenshotController().captureFromLongWidget(
      rowWidget,
      context: context,
      constraints: const BoxConstraints.tightFor(),
    );

    images.add(imageBytes);
  }

  return images;
}