f001_receipt_printing 2.0.0 copy "f001_receipt_printing: ^2.0.0" to clipboard
f001_receipt_printing: ^2.0.0 copied to clipboard

Flutter Package for Receipt Printing

example/lib/main.dart

import 'dart:developer';

import 'package:f001_receipt_printing/f001_receipt_printing.dart';
import 'package:f001_receipt_printing/f001_receipt_printing_device.dart';
import 'package:f001_receipt_printing/f001_receipt_printing_enums.dart';
import 'package:f001_receipt_printing/f001_receipt_printing_response.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  F001ReceiptPrinting? receiptPrinterManager;
  List<ReceiptPrintingDevice> bondedDevices = [];
  ReceiptPrintingDevice? selectedDevice;

  @override
  void initState() async {
    super.initState();
    try {
      receiptPrinterManager = await F001ReceiptPrinting.initialisePrinter(paperSize: PrinterPaperSize.mm80);
    } catch (ex) {
      log("Error initialising Receipt Printer: ${ex.toString()}");
    }

    if (receiptPrinterManager != null) {
      setState(() async {
        bondedDevices.addAll(await receiptPrinterManager!.scanForDevices());
      });
    }
  }

  Future<void> onPrinterTap({required ReceiptPrintingDevice device}) async {
    if (selectedDevice == null) {
      // First time connection.
      ReceiptPrinterResponse response = await receiptPrinterManager!.connectToDevice(device: device);
      if (response.actionSuccess) {
        selectedDevice = device;
      }
    } else if (selectedDevice?.address == device.address) {
      // Tapping on connected device.
      await receiptPrinterManager!.disconnectFromDevice();
      selectedDevice = null;
    } else {
      // Tapping on different device.
      await receiptPrinterManager!.disconnectFromDevice();
      ReceiptPrinterResponse response = await receiptPrinterManager!.connectToDevice(device: device);
      if (response.actionSuccess) {
        selectedDevice = device;
      }
    }
  }

  Future<void> onPrintButtonTap({required BuildContext context}) async {
    if (selectedDevice == null) {
      log("Please select a Bluetooth device before printing.");
    } else {
      // Widget value can be any Flutter widget, as long as it fits on the phone screen (like a screenshot).
      Widget receiptAsWidget = SizedBox(
        // You can test out with your own width value if you like.
        width: F001ReceiptPrinting.getWidgetWidthFromPaperSize(paperSize: PrinterPaperSize.mm80),
        child: const Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text("Text Row 1", style: TextStyle(color: Colors.black, fontSize: 14)),
            Text("Text Row 2", style: TextStyle(color: Colors.black, fontSize: 18)),
          ],
        ),
      );

      ReceiptPrinterResponse response = await receiptPrinterManager!.printReceipt(widgetToBeCaptured: receiptAsWidget, context: context);
      if (response.actionSuccess) {
        log("Printing Success.");
      } else {
        log("Error: ${response.errorMessage}");
      }
    }
  }

  @override
  Widget build(BuildContext context) {

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Receipt Printing"),
        ),
        body: SingleChildScrollView(
          padding: const EdgeInsets.all(10.0),
          physics: const AlwaysScrollableScrollPhysics(),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              bondedDevices.isEmpty
                  ? const Center(child: Text("No Devices Found", style: TextStyle(color: Colors.black, fontSize: 14)))
                  : ListView.builder(
                itemBuilder: (BuildContext listCtx, int index) {
                  return GestureDetector(
                    onTap: () async => await onPrinterTap(device: bondedDevices[index]),
                    child: ListTile(
                      title: Text(bondedDevices[index].name ?? "N/A", style: const TextStyle(color: Colors.black, fontSize: 14)),
                      subtitle: Text(bondedDevices[index].address, style: const TextStyle(color: Colors.black, fontSize: 12)),
                    ),
                  );
                },
              ),

              ElevatedButton(
                onPressed: () async => await onPrintButtonTap(context: context),
                child: const Text("PRINT RECEIPT", style: TextStyle(color: Colors.black, fontSize: 12),),
              ),

            ],
          ),
        ),
      ),
    );
  }
}