database_export_service.dart 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import 'dart:io';
  2. import 'package:file_picker/file_picker.dart';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:intl/intl.dart';
  6. import 'package:path/path.dart' as p;
  7. import 'package:path_provider/path_provider.dart';
  8. import 'package:share_plus/share_plus.dart';
  9. import '../core/constants.dart';
  10. class DatabaseExportService {
  11. DatabaseExportService._();
  12. static String _exportFileName() {
  13. final date = DateFormat('yyyy-MM-dd_HHmm').format(DateTime.now());
  14. return 'Ristoris_export_$date.db';
  15. }
  16. static Future<void> export(BuildContext context) async {
  17. if (kIsWeb) {
  18. _showError(context, 'Esportazione non supportata su web.');
  19. return;
  20. }
  21. try {
  22. final sourceFile = File(
  23. Platform.isAndroid
  24. ? '${AppConstants.kAndroidDbDir}/${AppConstants.kDbName}'
  25. : p.join(
  26. (await getApplicationDocumentsDirectory()).path,
  27. AppConstants.kDbName,
  28. ),
  29. );
  30. if (!await sourceFile.exists()) {
  31. if (!context.mounted) return;
  32. _showError(context, 'File database non trovato.');
  33. return;
  34. }
  35. final fileName = _exportFileName();
  36. if (Platform.isAndroid || Platform.isIOS) {
  37. final tempDir = await getTemporaryDirectory();
  38. final exportFile = File(p.join(tempDir.path, fileName));
  39. await sourceFile.copy(exportFile.path);
  40. await Share.shareXFiles([XFile(exportFile.path)]);
  41. } else if (Platform.isLinux) {
  42. final home = Platform.environment['HOME'] ?? '';
  43. final downloadsDir = Directory(p.join(home, 'Downloads'));
  44. if (!await downloadsDir.exists()) {
  45. await downloadsDir.create(recursive: true);
  46. }
  47. final destFile = File(p.join(downloadsDir.path, fileName));
  48. await sourceFile.copy(destFile.path);
  49. } else {
  50. final result = await FilePicker.platform.saveFile(
  51. dialogTitle: 'Esporta database',
  52. fileName: fileName,
  53. bytes: await sourceFile.readAsBytes(),
  54. );
  55. if (result == null) {
  56. if (!context.mounted) return;
  57. _showInfo(context, 'Esportazione annullata.');
  58. return;
  59. }
  60. }
  61. if (!context.mounted) return;
  62. _showSuccess(context, 'Database esportato con successo.');
  63. } catch (e) {
  64. if (!context.mounted) return;
  65. _showError(context, 'Errore durante l\'esportazione: $e');
  66. }
  67. }
  68. static void _showSuccess(BuildContext context, String message) {
  69. ScaffoldMessenger.of(context).showSnackBar(
  70. SnackBar(content: Text(message), backgroundColor: Colors.green),
  71. );
  72. }
  73. static void _showError(BuildContext context, String message) {
  74. ScaffoldMessenger.of(context).showSnackBar(
  75. SnackBar(content: Text(message), backgroundColor: Colors.red),
  76. );
  77. }
  78. static void _showInfo(BuildContext context, String message) {
  79. ScaffoldMessenger.of(context).showSnackBar(
  80. SnackBar(content: Text(message)),
  81. );
  82. }
  83. }