PharmaGO Packages
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_scannerpackage does not support Windows desktop. Use theBarcodeKeyboardListenerWidgetwith 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
-
Camera Scanner on Windows/macOS/Linux: The
mobile_scannerpackage does not support desktop platforms. UseBarcodeKeyboardListenerWidgetwith external USB scanners. -
Web Camera: Requires HTTPS in production environments.
-
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:
- mobile_scanner: Camera-based barcode scanning
- permission_handler: Camera permission handling
- audioplayers: Beep sound feedback
- shared_preferences: Local settings persistence
- device_info_plus: Device detection for performance optimization
- system_info_plus: RAM detection for adaptive settings
- pdf: PDF document generation
- printing: PDF preview and printing
- get: State management (optional)
- gap: UI spacing utilities
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.