pharmago_packages 1.1.2
pharmago_packages: ^1.1.2 copied to clipboard
Reusable Flutter components for pharmacy applications. Provides cross-platform widgets for barcode scanning (camera and external USB readers) and comprehensive PDF generation with KPIs, tables, and charts.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';
import 'package:pharmago_packages/pharmago_packages.dart';
import 'pages/barcode_page.dart';
import 'pages/home_page.dart';
import 'pages/pdf_pharmago_page.dart';
import 'pages/qr_scanner_page.dart';
void main() {
runApp(const MyApp());
}
/// Supported locales for the app
class AppLocales {
static const ptBR = Locale('pt', 'BR');
static const enUS = Locale('en', 'US');
static const esES = Locale('es', 'ES');
static const List<Locale> supportedLocales = [ptBR, enUS, esES];
/// Returns the next locale in the cycle
static Locale getNextLocale(Locale current) {
final currentIndex = supportedLocales.indexWhere(
(l) => l.languageCode == current.languageCode && l.countryCode == current.countryCode,
);
final nextIndex = (currentIndex + 1) % supportedLocales.length;
return supportedLocales[nextIndex];
}
/// Returns the flag emoji for a locale
static String getFlag(Locale locale) {
switch ('${locale.languageCode}_${locale.countryCode}') {
case 'pt_BR':
return '🇧🇷';
case 'en_US':
return '🇺🇸';
case 'es_ES':
return '🇪🇸';
default:
return '🌐';
}
}
/// Returns the language name for a locale
static String getLanguageName(Locale locale) {
switch ('${locale.languageCode}_${locale.countryCode}') {
case 'pt_BR':
return 'Português';
case 'en_US':
return 'English';
case 'es_ES':
return 'Español';
default:
return 'Unknown';
}
}
}
/// Translations class for the example app combining all translations
class AppTranslations extends Translations {
@override
Map<String, Map<String, String>> get keys {
// Merge package translations with app-specific translations
final translations = Map<String, Map<String, String>>.from(
PharmagoPackageTranslations.translations,
);
// Add app-specific translations
translations['en_US']?.addAll(_enUS);
translations['pt_BR']?.addAll(_ptBR);
translations['es_ES']?.addAll(_esES);
return translations;
}
static const Map<String, String> _enUS = {
// Home Page
'app_title': 'PharmaGO Packages',
'package_examples': 'Package Examples',
'select_package': 'Select a package to see its demonstration.',
'barcode_scanner_title': 'Barcode Scanner',
'barcode_scanner_description':
'Camera-based barcode scanning and external reader support with keyboard listener.',
'pdf_pharmago_title': 'PDF PharmaGO',
'pdf_pharmago_description':
'Custom PDF generation with headers, KPIs, tables, charts, and footers.',
'qr_scanner_card_title': 'QR Code Tracker',
'qr_scanner_card_description':
'Full-screen QR Code auto-detection that follows and shows the code position in real time.',
'toggle_theme': 'Toggle theme',
'change_language': 'Change language',
// QR Scanner Page
'qr_scanner_title': 'QR Code Tracker',
'qr_scanner_change_color': 'Change overlay color',
'qr_scanner_toggle_label': 'Toggle custom label',
'qr_scanner_camera_error': 'Could not start the camera.',
'qr_scanner_point_camera': 'Point the camera at one or more QR Codes',
'qr_scanner_no_value': '(no value)',
'qr_scanner_detected_singular': 'detected',
'qr_scanner_detected_plural': 'detected',
// PDF Page
'pdf_demo_title': 'PDF PharmaGO Demo',
'pdf_generation': 'PDF Generation',
'pdf_demo_description':
'This example demonstrates the PDF PharmaGO package capabilities:',
'pdf_feature_header': 'Custom header with title, subtitle, and app name',
'pdf_feature_kpi': 'KPI sections with trend indicators',
'pdf_feature_table': 'Data tables with 150 items and footer totals',
'pdf_feature_charts': 'Charts: bar, pie, and line with PdfColumnSpan',
'pdf_feature_footer': 'Footer with page numbers (maxPage: 500)',
'pdf_feature_form': 'Form sections with label/value pairs and styling',
'options': 'Options',
'landscape_orientation': 'Landscape orientation',
'landscape_subtitle': 'Generate PDF in landscape mode',
'generate_pdf': 'Generate PDF',
'generating': 'Generating...',
'pdf_info_text':
'Click the button to generate a sample sales report PDF and preview it.',
'pdf_package_info':
'Uses pdf and printing packages for cross-platform PDF generation and preview.',
};
static const Map<String, String> _ptBR = {
// Home Page
'app_title': 'PharmaGO Packages',
'package_examples': 'Exemplos de Pacotes',
'select_package': 'Selecione um pacote para ver sua demonstração.',
'barcode_scanner_title': 'Scanner de Código de Barras',
'barcode_scanner_description':
'Leitura de código de barras por câmera e suporte a leitor externo com listener de teclado.',
'pdf_pharmago_title': 'PDF PharmaGO',
'pdf_pharmago_description':
'Geração de PDF customizado com cabeçalhos, KPIs, tabelas, gráficos e rodapés.',
'qr_scanner_card_title': 'Rastreador de QR Code',
'qr_scanner_card_description':
'Auto detecção de QR Code em tela cheia que segue e mostra a posição do código em tempo real.',
'toggle_theme': 'Alternar tema',
'change_language': 'Mudar idioma',
// QR Scanner Page
'qr_scanner_title': 'Rastreador de QR Code',
'qr_scanner_change_color': 'Mudar cor do overlay',
'qr_scanner_toggle_label': 'Alternar rótulo customizado',
'qr_scanner_camera_error': 'Não foi possível iniciar a câmera.',
'qr_scanner_point_camera': 'Aponte a câmera para um ou mais QR Codes',
'qr_scanner_no_value': '(sem valor)',
'qr_scanner_detected_singular': 'detectado',
'qr_scanner_detected_plural': 'detectados',
// PDF Page
'pdf_demo_title': 'Demo do PDF PharmaGO',
'pdf_generation': 'Geração de PDF',
'pdf_demo_description':
'Este exemplo demonstra as capacidades do pacote PDF PharmaGO:',
'pdf_feature_header': 'Cabeçalho customizado com título, subtítulo e nome do app',
'pdf_feature_kpi': 'Seções de KPI com indicadores de tendência',
'pdf_feature_table': 'Tabelas de dados com 150 itens e totais no rodapé',
'pdf_feature_charts': 'Gráficos: barra, pizza e linha com PdfColumnSpan',
'pdf_feature_footer': 'Rodapé com números de página (maxPage: 500)',
'pdf_feature_form': 'Seções de formulário com pares label/valor e estilos',
'options': 'Opções',
'landscape_orientation': 'Orientação paisagem',
'landscape_subtitle': 'Gerar PDF em modo paisagem',
'generate_pdf': 'Gerar PDF',
'generating': 'Gerando...',
'pdf_info_text':
'Clique no botão para gerar um relatório de vendas de exemplo em PDF e visualizá-lo.',
'pdf_package_info':
'Usa pacotes pdf e printing para geração e visualização de PDF multiplataforma.',
};
static const Map<String, String> _esES = {
// Home Page
'app_title': 'PharmaGO Packages',
'package_examples': 'Ejemplos de Paquetes',
'select_package': 'Seleccione un paquete para ver su demostración.',
'barcode_scanner_title': 'Escáner de Código de Barras',
'barcode_scanner_description':
'Escaneo de código de barras por cámara y soporte a lector externo con listener de teclado.',
'pdf_pharmago_title': 'PDF PharmaGO',
'pdf_pharmago_description':
'Generación de PDF personalizado con encabezados, KPIs, tablas, gráficos y pies de página.',
'qr_scanner_card_title': 'Rastreador de Código QR',
'qr_scanner_card_description':
'Detección automática de Código QR en pantalla completa que sigue y muestra la posición del código en tiempo real.',
'toggle_theme': 'Cambiar tema',
'change_language': 'Cambiar idioma',
// QR Scanner Page
'qr_scanner_title': 'Rastreador de Código QR',
'qr_scanner_change_color': 'Cambiar color del overlay',
'qr_scanner_toggle_label': 'Alternar etiqueta personalizada',
'qr_scanner_camera_error': 'No se pudo iniciar la cámara.',
'qr_scanner_point_camera': 'Apunte la cámara a uno o más Códigos QR',
'qr_scanner_no_value': '(sin valor)',
'qr_scanner_detected_singular': 'detectado',
'qr_scanner_detected_plural': 'detectados',
// PDF Page
'pdf_demo_title': 'Demo de PDF PharmaGO',
'pdf_generation': 'Generación de PDF',
'pdf_demo_description':
'Este ejemplo demuestra las capacidades del paquete PDF PharmaGO:',
'pdf_feature_header':
'Encabezado personalizado con título, subtítulo y nombre de la app',
'pdf_feature_kpi': 'Secciones de KPI con indicadores de tendencia',
'pdf_feature_table': 'Tablas de datos con 150 elementos y totales en el pie',
'pdf_feature_charts': 'Gráficos: barra, pastel y línea con PdfColumnSpan',
'pdf_feature_footer': 'Pie de página con números de página (maxPage: 500)',
'pdf_feature_form': 'Secciones de formulario con pares etiqueta/valor y estilos',
'options': 'Opciones',
'landscape_orientation': 'Orientación horizontal',
'landscape_subtitle': 'Generar PDF en modo horizontal',
'generate_pdf': 'Generar PDF',
'generating': 'Generando...',
'pdf_info_text':
'Haga clic en el botón para generar un informe de ventas de ejemplo en PDF y previsualizarlo.',
'pdf_package_info':
'Usa paquetes pdf y printing para generación y visualización de PDF multiplataforma.',
};
}
/// Language switcher widget for AppBar
/// Cycles through pt_BR -> en_US -> es_ES on each tap
class LanguageSwitcher extends StatelessWidget {
const LanguageSwitcher({super.key});
@override
Widget build(BuildContext context) {
return GetBuilder<GetMaterialController>(
builder: (_) {
final currentLocale = Get.locale ?? AppLocales.ptBR;
return IconButton(
icon: Text(
AppLocales.getFlag(currentLocale),
style: const TextStyle(fontSize: 20),
),
onPressed: () {
final nextLocale = AppLocales.getNextLocale(currentLocale);
Get.updateLocale(nextLocale);
},
tooltip: 'change_language'.tr,
);
},
);
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'PharmaGO Packages Demo',
translations: AppTranslations(),
locale: AppLocales.ptBR,
fallbackLocale: AppLocales.ptBR,
supportedLocales: AppLocales.supportedLocales,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.light,
),
useMaterial3: true,
),
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.dark,
),
useMaterial3: true,
),
themeMode: ThemeMode.system,
initialRoute: '/',
getPages: [
GetPage(
name: '/',
page: () => const HomePage(),
),
GetPage(
name: '/barcode',
page: () => const BarcodePage(),
),
GetPage(
name: '/pdf',
page: () => const PdfPharmagoPage(),
),
GetPage(
name: '/qr_scanner',
page: () => const QrScannerPage(),
),
],
);
}
}