barcode_scanner/lib/components/product_scanned_component.dart
mandreshope e963abb0ce feat: Implements app theme system
Replaces hardcoded colors and standard Theme.of(context) accesses with a custom AppTheme.

Introduces distinct light and dark themes and persists the selected theme mode using shared_preferences.

Integrates the theme into the main app structure and applies it to various components and pages.

Adds google_fonts dependency for theme typography.
2025-06-23 17:48:03 +03:00

183 lines
6.9 KiB
Dart

import 'package:barcode_scanner/themes/app_theme.dart';
import 'package:flutter/material.dart';
class ProductScannedComponent extends StatefulWidget {
const ProductScannedComponent({
super.key,
required this.codeScanned,
required this.productName,
required this.brands,
required this.img,
this.onRescan,
this.onDetails,
});
final String codeScanned;
final String productName;
final String brands;
final String img;
final Future Function()? onRescan;
final Function()? onDetails;
@override
State<ProductScannedComponent> createState() =>
_ProductScannedComponentState();
}
class _ProductScannedComponentState extends State<ProductScannedComponent> {
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.all(24.0),
child: Container(
width: double.infinity,
decoration: BoxDecoration(
color: AppTheme.of(context).secondaryBackground,
borderRadius: BorderRadius.circular(16.0),
),
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
spacing: 16,
children: [
Container(
width: 80.0,
height: 80.0,
decoration: BoxDecoration(
color: Colors.green,
shape: BoxShape.circle,
),
child: Align(
alignment: AlignmentDirectional(0.0, 0.0),
child: Icon(
Icons.check_rounded,
color: Colors.white,
size: 40.0,
),
),
),
Text('Scan terminé!', textAlign: TextAlign.center),
Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: SizedBox(
width: double.infinity,
child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 8,
children: [
Align(
alignment: Alignment.topCenter,
child: Image.network(
widget.img,
height: MediaQuery.sizeOf(context).height * .2,
),
),
SizedBox(height: 15),
Divider(
height: 1.0,
thickness: 1.0,
color: Colors.grey.shade300,
),
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Code scanné:'),
Text(widget.codeScanned),
],
),
Divider(
height: 1.0,
thickness: 1.0,
color: Colors.grey.shade300,
),
Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Produit: '),
Expanded(
child: Text(
widget.productName,
textAlign: TextAlign.end,
),
),
],
),
Divider(
height: 1.0,
thickness: 1.0,
color: Colors.grey.shade300,
),
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [Text('Marque:'), Text(widget.brands)],
),
Divider(
height: 1.0,
thickness: 1.0,
color: Colors.grey.shade300,
),
// Row(
// mainAxisSize: MainAxisSize.max,
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [Text('Prix:'), Text('4,99 €')],
// ),
],
),
),
),
),
Row(
mainAxisSize: MainAxisSize.max,
spacing: 12,
children: [
Expanded(
child: FilledButton.tonal(
onPressed: () async {
await widget.onRescan?.call();
},
child: Text(
'Nouveau scan',
style: AppTheme.of(context).bodyMedium,
),
),
),
Expanded(
child: FilledButton(
style: ButtonStyle(
backgroundColor: WidgetStatePropertyAll(
AppTheme.of(context).primary,
),
),
onPressed: () {
widget.onDetails?.call();
},
child: Text(
'Voir détails',
style: AppTheme.of(context).bodyMedium,
),
),
),
],
),
],
),
),
),
),
],
);
}
}