main.dart 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import 'dart:io';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4. import 'package:permission_handler/permission_handler.dart';
  5. import 'database/database.dart';
  6. import 'app.dart';
  7. void main() async {
  8. WidgetsFlutterBinding.ensureInitialized();
  9. if (Platform.isAndroid) {
  10. var status = await Permission.manageExternalStorage.status;
  11. if (!status.isGranted) {
  12. await Permission.manageExternalStorage.request();
  13. for (var i = 0; i < 30; i++) {
  14. await Future.delayed(const Duration(seconds: 1));
  15. status = await Permission.manageExternalStorage.status;
  16. if (status.isGranted) break;
  17. }
  18. if (!status.isGranted) {
  19. runApp(
  20. const ProviderScope(child: _PermissionDeniedApp()),
  21. );
  22. return;
  23. }
  24. }
  25. }
  26. await AppDatabase.ensureDatabaseReady();
  27. runApp(
  28. const ProviderScope(child: RistorisApp()),
  29. );
  30. }
  31. class _PermissionDeniedApp extends StatelessWidget {
  32. const _PermissionDeniedApp();
  33. @override
  34. Widget build(BuildContext context) {
  35. return MaterialApp(
  36. home: Scaffold(
  37. body: Center(
  38. child: Padding(
  39. padding: const EdgeInsets.all(32),
  40. child: Column(
  41. mainAxisSize: MainAxisSize.min,
  42. children: [
  43. const Icon(
  44. Icons.folder_off,
  45. size: 64,
  46. color: Colors.red,
  47. ),
  48. const SizedBox(height: 24),
  49. const Text(
  50. 'Permesso di accesso ai file non concesso',
  51. textAlign: TextAlign.center,
  52. style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
  53. ),
  54. const SizedBox(height: 12),
  55. const Text(
  56. 'L\'app ha bisogno di accedere alla memoria del dispositivo per salvare il database.',
  57. textAlign: TextAlign.center,
  58. ),
  59. const SizedBox(height: 24),
  60. FilledButton.icon(
  61. onPressed: () => openAppSettings(),
  62. icon: const Icon(Icons.settings),
  63. label: const Text('Apri Impostazioni'),
  64. ),
  65. ],
  66. ),
  67. ),
  68. ),
  69. ),
  70. );
  71. }
  72. }