From a63cfa13ba92080786f87db8c35faa58b73b8e37 Mon Sep 17 00:00:00 2001 From: Felix Kirchner Date: Sun, 24 Aug 2025 15:52:29 +0200 Subject: [PATCH] Experimenten with database --- lib/data/db/database.dart | 2 ++ lib/data/dto/game_manager.dart | 4 ++- lib/main.dart | 12 +++++-- .../views/home/create_game_view.dart | 6 +++- .../views/home/main_menu_view.dart | 36 ++++++++++++++++--- lib/services/local_storage_service.dart | 10 +++--- pubspec.yaml | 2 +- 7 files changed, 58 insertions(+), 14 deletions(-) diff --git a/lib/data/db/database.dart b/lib/data/db/database.dart index 35b3435..841bb7e 100644 --- a/lib/data/db/database.dart +++ b/lib/data/db/database.dart @@ -30,3 +30,5 @@ class AppDatabase extends _$AppDatabase { ); } } + +final db = AppDatabase(); diff --git a/lib/data/dto/game_manager.dart b/lib/data/dto/game_manager.dart index cec7db9..161ede6 100644 --- a/lib/data/dto/game_manager.dart +++ b/lib/data/dto/game_manager.dart @@ -1,3 +1,4 @@ +import 'package:cabo_counter/data/db/database.dart'; import 'package:cabo_counter/data/dto/game_session.dart'; import 'package:cabo_counter/services/local_storage_service.dart'; import 'package:collection/collection.dart'; @@ -11,7 +12,7 @@ class GameManager extends ChangeNotifier { /// sorts the list in descending order based on the creation date, and notifies listeners of the change. /// It also saves the updated game sessions to local storage. /// Returns the index of the newly added session in the sorted list. - int addGameSession(GameSession session) { + int addGameSession(GameSession session, AppDatabase db) { session.addListener(() { notifyListeners(); // Propagate session changes }); @@ -19,6 +20,7 @@ class GameManager extends ChangeNotifier { gameList.sort((a, b) => b.createdAt.compareTo(a.createdAt)); notifyListeners(); LocalStorageService.saveGameSessions(); + db.gameSessionDao.insertGameSession(session); return gameList.indexOf(session); } diff --git a/lib/main.dart b/lib/main.dart index adaffdb..bd9d071 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:cabo_counter/core/custom_theme.dart'; +import 'package:cabo_counter/data/db/database.dart'; import 'package:cabo_counter/l10n/generated/app_localizations.dart'; import 'package:cabo_counter/presentation/views/tab_view.dart'; import 'package:cabo_counter/services/config_service.dart'; @@ -6,6 +7,7 @@ import 'package:cabo_counter/services/local_storage_service.dart'; import 'package:cabo_counter/services/version_service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -16,7 +18,12 @@ Future main() async { // Initialize services await ConfigService.initConfig(); await VersionService.init(); - runApp(const App()); + runApp( + Provider( + create: (_) => db, + child: const App(), + ), + ); } class App extends StatefulWidget { @@ -31,7 +38,6 @@ class _AppState extends State with WidgetsBindingObserver { void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); - LocalStorageService.loadGameSessions(); } @override @@ -53,7 +59,7 @@ class _AppState extends State with WidgetsBindingObserver { @override Widget build(BuildContext context) { - LocalStorageService.loadGameSessions(); + //LocalStorageService.loadGameSessions(); return CupertinoApp( localizationsDelegates: AppLocalizations.localizationsDelegates, diff --git a/lib/presentation/views/home/create_game_view.dart b/lib/presentation/views/home/create_game_view.dart index 5ad0c7f..b769aa4 100644 --- a/lib/presentation/views/home/create_game_view.dart +++ b/lib/presentation/views/home/create_game_view.dart @@ -1,5 +1,6 @@ import 'package:cabo_counter/core/constants.dart'; import 'package:cabo_counter/core/custom_theme.dart'; +import 'package:cabo_counter/data/db/database.dart'; import 'package:cabo_counter/data/dto/game_manager.dart'; import 'package:cabo_counter/data/dto/game_session.dart'; import 'package:cabo_counter/data/dto/player.dart'; @@ -11,6 +12,7 @@ import 'package:cabo_counter/services/config_service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; +import 'package:provider/provider.dart'; import 'package:uuid/uuid.dart'; enum CreateStatus { @@ -479,7 +481,9 @@ class _CreateGameViewState extends State { caboPenalty: ConfigService.getCaboPenalty(), isPointsLimitEnabled: isPointsLimitEnabled, isGameFinished: false); - gameManager.addGameSession(gameSession); + + final db = Provider.of(context, listen: false); + gameManager.addGameSession(gameSession, db); final session = gameManager.getGameSessionById(gameId) ?? gameSession; Navigator.pushAndRemoveUntil( diff --git a/lib/presentation/views/home/main_menu_view.dart b/lib/presentation/views/home/main_menu_view.dart index ce616c0..39ddece 100644 --- a/lib/presentation/views/home/main_menu_view.dart +++ b/lib/presentation/views/home/main_menu_view.dart @@ -1,5 +1,6 @@ import 'package:cabo_counter/core/constants.dart'; import 'package:cabo_counter/core/custom_theme.dart'; +import 'package:cabo_counter/data/db/database.dart'; import 'package:cabo_counter/data/dto/game_manager.dart'; import 'package:cabo_counter/data/dto/game_session.dart'; import 'package:cabo_counter/l10n/generated/app_localizations.dart'; @@ -7,9 +8,9 @@ import 'package:cabo_counter/presentation/views/home/active_game/active_game_vie import 'package:cabo_counter/presentation/views/home/create_game_view.dart'; import 'package:cabo_counter/presentation/views/home/settings_view.dart'; import 'package:cabo_counter/services/config_service.dart'; -import 'package:cabo_counter/services/local_storage_service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; enum PreRatingDialogDecision { yes, no, cancel } @@ -31,16 +32,34 @@ class MainMenuView extends StatefulWidget { class _MainMenuViewState extends State { bool _isLoading = true; + late final AppDatabase db; @override initState() { super.initState(); - LocalStorageService.loadGameSessions().then((_) { + db = Provider.of(context, listen: false); + + db.gameSessionDao.getAllGameSessions().then((gameSessions) { + print( + '[MainMenuView] Loaded ${gameSessions.length} game sessions from the database.'); + for (final session in gameSessions) { + gameManager.addGameSession(session, db); + } + + print('[MainMenuView] Game sessions loaded successfully.'); + setState(() { + _isLoading = false; + }); + }).catchError((error) { + print('[MainMenuView] Error loading game sessions: $error'); + }); + + /* LocalStorageService.loadGameSessions().then((_) { setState(() { _isLoading = false; }); }); - gameManager.addListener(_updateView); + gameManager.addListener(_updateView);*/ WidgetsBinding.instance.addPostFrameCallback((_) async { precacheImage( @@ -216,7 +235,16 @@ class _MainMenuViewState extends State { ], ), ), - child: const Center(child: CupertinoActivityIndicator()), + child: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CupertinoActivityIndicator(), + const SizedBox(height: 10), + Text(AppLocalizations.of(context).loading_games) + ], + )), ), ))); }); diff --git a/lib/services/local_storage_service.dart b/lib/services/local_storage_service.dart index 044b7b0..5409083 100644 --- a/lib/services/local_storage_service.dart +++ b/lib/services/local_storage_service.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:cabo_counter/data/db/database.dart'; import 'package:cabo_counter/data/dto/game_manager.dart'; import 'package:cabo_counter/data/dto/game_session.dart'; import 'package:file_picker/file_picker.dart'; @@ -173,12 +174,12 @@ class LocalStorageService { .toList(); for (GameSession s in importedList) { - _importSession(s); + _importSession(s, db); } } else if (await _validateJsonSchema(jsonString, false)) { // Checks if the JSON String is in the single game format final jsonData = json.decode(jsonString) as Map; - _importSession(GameSession.fromJson(jsonData)); + _importSession(GameSession.fromJson(jsonData), db); } else { return ImportStatus.validationError; } @@ -199,13 +200,14 @@ class LocalStorageService { } /// Imports a single game session into the gameList. - static Future _importSession(GameSession session) async { + static Future _importSession( + GameSession session, AppDatabase db) async { if (gameManager.gameExistsInGameList(session.id)) { print( '[local_storage_service.dart] Die Session mit der ID ${session.id} existiert bereits. Sie wird überschrieben.'); gameManager.removeGameSessionById(session.id); } - gameManager.addGameSession(session); + gameManager.addGameSession(session, db); print( '[local_storage_service.dart] Die Session mit der ID ${session.id} wurde erfolgreich importiert.'); } diff --git a/pubspec.yaml b/pubspec.yaml index e21aef0..a3f3d9b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: cabo_counter description: "Mobile app for the card game Cabo" publish_to: 'none' -version: 0.5.8+685 +version: 0.5.8+688 environment: sdk: ^3.5.4