PharmaGO Packages

pub package License

Reusable Flutter components for pharmacy applications. This package provides generic, cross-platform widgets and utilities for barcode scanning and PDF generation.

Platform Support

Feature Android iOS Windows Web macOS Linux
PDF Generation :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
PDF Preview/Print :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
Camera Barcode Scanner :white_check_mark: :white_check_mark: :x: :white_check_mark: :x: :x:
External Keyboard Scanner :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:

Platform-Specific Notes

Windows

  • Camera Scanner: Not supported. The mobile_scanner package does not support Windows desktop. Use the BarcodeKeyboardListenerWidget with an external USB barcode scanner instead.
  • PDF: Fully supported with print preview capabilities.

Web

  • Camera Scanner: Supported (requires HTTPS in production for camera access).
  • External Keyboard Scanner: Works with USB barcode scanners that emulate keyboard input.
  • PDF: Fully supported with browser print dialog.

macOS / Linux

  • Camera Scanner: Not currently supported by mobile_scanner.
  • External Keyboard Scanner: Fully supported.
  • PDF: Fully supported.

Features

Barcode Scanning

  • Camera-based scanning with customizable overlay and controls
  • External keyboard/scanner support for USB barcode readers (Datalogic, Honeywell, etc.)
  • Auto-focus and zoom controls
  • Flash/torch support
  • Configurable scan area with expand/collapse
  • Beep sound feedback
  • Cooldown between scans to prevent duplicate reads

PDF Generation

  • Custom headers with logo, app name, title, and subtitle
  • KPI sections with Bootstrap-like grid system (col1-col12)
  • Tables with customizable headers, body, and footers
  • Charts: Bar (vertical/horizontal), Pie, and Line charts
  • Custom footers with pagination
  • Portrait and landscape page orientations
  • Page limit protection with configurable max pages

Installation

Add this package to your pubspec.yaml:

dependencies:
  pharmago_packages: ^1.0.0

Then run:

flutter pub get

Usage

Barcode Scanner (Camera)

import 'package:pharmago_packages/pharmago_packages.dart';

// Camera-based scanner (Android, iOS, Web)
BarcodeScannerWidget(
  onBarcodeDetected: (barcode) {
    print('Scanned: $barcode');
  },
  config: BarcodeScannerConfig(
    enableFlash: true,
    enableZoom: true,
    enableAutoFocus: true,
    scanIntervalSeconds: 2.0,
    showSettingsButton: true, // Shows settings bottom sheet with all controls
    onScanIntervalChanged: (value) {
      print('Scan interval changed to: $value s');
    },
    permissionDeniedText: 'Camera permission is required',
    allowCameraText: 'Allow Camera',
    cameraReadDelayText: 'Read Delay',
    cameraReadDelaySubtitleText: '{seconds}s between reads',
  ),
)

Barcode Scanner (External Keyboard/USB Reader)

import 'package:pharmago_packages/pharmago_packages.dart';

// External keyboard/scanner listener (all platforms)
BarcodeKeyboardListenerWidget(
  onBarcode: (barcode) {
    print('Scanned: $barcode');
  },
  config: BarcodeKeyboardListenerConfig(
    minBarcodeLength: 4,
    maxBarcodeLength: 13,
    numericOnly: true,
    activeText: 'External Reader Active',
    instructionText: 'Point the scanner at a barcode',
  ),
)

Scanner Settings Persistence

The barcode scanner settings can be persisted locally on the device. This allows users to configure their preferred settings once and have them remembered across app sessions.

import 'package:pharmago_packages/pharmago_packages.dart';

// Retrieve all settings at once
final settings = await BarcodeScannerSettings.getAllSettings();
print('Read delay: ${settings.cameraReadDelay}s');
print('Zoom: ${settings.zoomLevel}');
print('Flash: ${settings.flashEnabled}');
print('Auto Focus: ${settings.autoFocusEnabled}');
print('Expanded Area: ${settings.expandedScanArea}');

// Set individual settings
await BarcodeScannerSettings.setCameraReadDelay(1.5); // 0.25 to 3.0 seconds
await BarcodeScannerSettings.setZoomLevel(0.5);       // 0.0 to 1.0
await BarcodeScannerSettings.setFlashEnabled(true);
await BarcodeScannerSettings.setAutoFocusEnabled(true);
await BarcodeScannerSettings.setExpandedScanArea(true);

// Get individual settings
final delay = await BarcodeScannerSettings.getCameraReadDelay();
final zoom = await BarcodeScannerSettings.getZoomLevel();

// Save all settings at once
await BarcodeScannerSettings.saveAllSettings(
  BarcodeScannerSettingsData(
    cameraReadDelay: 1.5,
    zoomLevel: 0.5,
    flashEnabled: true,
    autoFocusEnabled: false,
    expandedScanArea: false,
  ),
);

// Reset to defaults
await BarcodeScannerSettings.resetToDefaults();

// Get valid delay values (0.25, 0.5, 0.75, ..., 3.0)
final validValues = BarcodeScannerSettings.validCameraReadDelayValues;

Camera Read Delay Slider

The settings bottom sheet includes a slider to configure the camera read delay (time between barcode reads). The slider allows values from 0.25 to 3.0 seconds in 0.25s increments:

  • 0.25s - Fastest scanning, good for rapid inventory counting
  • 1.0s - Balanced speed for general use
  • 2.0s - Default, prevents accidental duplicate scans
  • 3.0s - Slowest, for careful single-item scanning

The selected value is automatically persisted to local storage and restored when the app restarts.

PDF Generation

import 'package:pharmago_packages/pharmago_packages.dart';
import 'package:printing/printing.dart';

// Create a PDF builder
final pdfBuilder = PdfBuilder(
  config: PdfConfig.a4Portrait(),
  header: PdfHeaderConfig(
    title: 'Monthly Report',
    subtitle: 'January 2025 - Sales Summary',
    appName: 'MyApp',
  ),
  footer: const PdfFooterConfig(
    leftText: 'Generated by MyApp',
    showPageNumbers: true,
  ),
  maxPages: 500,
);

// Add KPI section
pdfBuilder.addSection(
  PdfKpiSection(
    order: 1,
    sectionTitle: 'Key Metrics',
    items: [
      const PdfKpiItem(
        title: 'Total Sales',
        value: '\$125,430.00',
        columnSpan: PdfColumnSpan.col6,
        trend: KpiTrend.positive,
        trendValue: '+12.5%',
      ),
      const PdfKpiItem(
        title: 'Units Sold',
        value: '3,847',
        columnSpan: PdfColumnSpan.col6,
        trend: KpiTrend.positive,
        trendValue: '+8.2%',
      ),
    ],
  ),
);

// Add Table section
pdfBuilder.addSection(
  PdfTableSection(
    order: 2,
    sectionTitle: 'Top Products',
    headers: [
      const PdfTableHeaderConfig(title: '#', flex: 1),
      const PdfTableHeaderConfig(title: 'Product', flex: 4),
      const PdfTableHeaderConfig(title: 'Qty', flex: 1, textAlign: pw.TextAlign.right),
    ],
    rows: [
      // Your table rows here
    ],
  ),
);

// Add Chart section
pdfBuilder.addSection(
  PdfChartSection(
    order: 3,
    sectionTitle: 'Sales Analytics',
    items: [
      PdfChartItem(
        columnSpan: PdfColumnSpan.col6,
        config: const PdfChartConfig(
          type: PdfChartType.barVertical,
          title: 'Monthly Sales',
          height: 180,
          dataPoints: [
            PdfChartDataPoint(label: 'Jan', value: 125430),
            PdfChartDataPoint(label: 'Feb', value: 98750),
            // ...
          ],
        ),
      ),
    ],
  ),
);

// Build and preview PDF
final result = await pdfBuilder.buildWithResult();
await Printing.layoutPdf(
  onLayout: (format) async => result.bytes,
  name: 'Report.pdf',
);

Platform-Specific Setup

Android

Add camera permission to android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA" />

iOS

Add camera usage description to ios/Runner/Info.plist:

<key>NSCameraUsageDescription</key>
<string>Camera access is required for barcode scanning</string>

Web

For camera access on web, your app must be served over HTTPS in production. During development, localhost works without HTTPS.

Windows

No special setup required. Note that camera-based barcode scanning is not available on Windows - use external USB barcode scanners with BarcodeKeyboardListenerWidget instead.

Known Limitations

  1. Camera Scanner on Windows/macOS/Linux: The mobile_scanner package does not support desktop platforms. Use BarcodeKeyboardListenerWidget with external USB scanners.

  2. Web Camera: Requires HTTPS in production environments.

  3. External Scanner on Web: Works with USB scanners that emulate keyboard input. Some advanced scanner features (like Datalogic broadcast) are not available on web.

Dependencies

This package uses the following dependencies:

Example

Check the /example folder for a complete demo application showcasing all features.

cd example
flutter run

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

PharmaGO Team

For questions or support, please open an issue on GitHub.

Libraries

pharmago_packages
PharmaGO Packages - Reusable Flutter components for pharmacy applications.