HomeView Mock-Daten entfernen #51
@@ -1,9 +1,13 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:game_tracker/data/db/database.dart';
|
import 'package:game_tracker/data/db/database.dart';
|
||||||
|
import 'package:game_tracker/data/dto/game.dart';
|
||||||
|
import 'package:game_tracker/data/dto/group.dart';
|
||||||
|
import 'package:game_tracker/data/dto/player.dart';
|
||||||
import 'package:game_tracker/presentation/widgets/buttons/quick_create_button.dart';
|
import 'package:game_tracker/presentation/widgets/buttons/quick_create_button.dart';
|
||||||
import 'package:game_tracker/presentation/widgets/tiles/game_tile.dart';
|
import 'package:game_tracker/presentation/widgets/tiles/game_tile.dart';
|
||||||
import 'package:game_tracker/presentation/widgets/tiles/info_tile.dart';
|
import 'package:game_tracker/presentation/widgets/tiles/info_tile.dart';
|
||||||
import 'package:game_tracker/presentation/widgets/tiles/quick_info_tile.dart';
|
import 'package:game_tracker/presentation/widgets/tiles/quick_info_tile.dart';
|
||||||
|
import 'package:game_tracker/presentation/widgets/top_centered_message.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:skeletonizer/skeletonizer.dart';
|
import 'package:skeletonizer/skeletonizer.dart';
|
||||||
|
|
||||||
@@ -17,23 +21,43 @@ class HomeView extends StatefulWidget {
|
|||||||
class _HomeViewState extends State<HomeView> {
|
class _HomeViewState extends State<HomeView> {
|
||||||
late Future<int> _gameCountFuture;
|
late Future<int> _gameCountFuture;
|
||||||
late Future<int> _groupCountFuture;
|
late Future<int> _groupCountFuture;
|
||||||
|
late Future<List<Game>> _recentGamesFuture;
|
||||||
bool isLoading = true;
|
bool isLoading = true;
|
||||||
|
|
||||||
|
late final List<Game> skeletonData = List.filled(
|
||||||
|
2,
|
||||||
|
Game(
|
||||||
|
name: 'Skeleton Game',
|
||||||
|
group: Group(
|
||||||
|
name: 'Skeleton Group',
|
||||||
|
members: [
|
||||||
|
Player(name: 'Skeleton Player 1'),
|
||||||
|
Player(name: 'Skeleton Player 2'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
winner:
|
||||||
|
"Winner ID", //TODO: Should be player object, but isnt yet, waiting for pr
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
initState() {
|
initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
final db = Provider.of<AppDatabase>(context, listen: false);
|
final db = Provider.of<AppDatabase>(context, listen: false);
|
||||||
_gameCountFuture = db.gameDao.getGameCount();
|
_gameCountFuture = db.gameDao.getGameCount();
|
||||||
_groupCountFuture = db.groupDao.getGroupCount();
|
_groupCountFuture = db.groupDao.getGroupCount();
|
||||||
|
_recentGamesFuture = db.gameDao.getAllGames();
|
||||||
|
|
||||||
Future.wait([_gameCountFuture, _groupCountFuture]).then((_) async {
|
Future.wait([_gameCountFuture, _groupCountFuture, _recentGamesFuture]).then(
|
||||||
|
(_) async {
|
||||||
await Future.delayed(const Duration(milliseconds: 50));
|
await Future.delayed(const Duration(milliseconds: 50));
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -48,12 +72,21 @@ class _HomeViewState extends State<HomeView> {
|
|||||||
),
|
),
|
||||||
enabled: isLoading,
|
enabled: isLoading,
|
||||||
enableSwitchAnimation: true,
|
enableSwitchAnimation: true,
|
||||||
switchAnimationConfig: const SwitchAnimationConfig(
|
switchAnimationConfig: SwitchAnimationConfig(
|
||||||
duration: Duration(milliseconds: 200),
|
duration: Duration(milliseconds: 200),
|
||||||
switchInCurve: Curves.linear,
|
switchInCurve: Curves.linear,
|
||||||
switchOutCurve: Curves.linear,
|
switchOutCurve: Curves.linear,
|
||||||
transitionBuilder: AnimatedSwitcher.defaultTransitionBuilder,
|
transitionBuilder: AnimatedSwitcher.defaultTransitionBuilder,
|
||||||
layoutBuilder: AnimatedSwitcher.defaultLayoutBuilder,
|
layoutBuilder:
|
||||||
|
(Widget? currentChild, List<Widget> previousChildren) {
|
||||||
|
return Stack(
|
||||||
|
alignment: Alignment.topCenter,
|
||||||
|
children: [
|
||||||
|
...previousChildren,
|
||||||
|
if (currentChild != null) currentChild,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -97,41 +130,70 @@ class _HomeViewState extends State<HomeView> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Padding(
|
FutureBuilder(
|
||||||
|
future: _recentGamesFuture,
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.hasError) {
|
||||||
|
return const Center(
|
||||||
|
child: TopCenteredMessage(
|
||||||
|
icon: Icons.report,
|
||||||
|
title: 'Error',
|
||||||
|
message: 'Group data couldn\'t\nbe loaded.',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (snapshot.connectionState == ConnectionState.done &&
|
||||||
|
(!snapshot.hasData || snapshot.data!.isEmpty)) {
|
||||||
|
return const Center(
|
||||||
|
child: TopCenteredMessage(
|
||||||
|
icon: Icons.info,
|
||||||
|
title: 'Info',
|
||||||
|
message: 'No games created yet.',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
final List<Game> games =
|
||||||
|
isLoading ? skeletonData : (snapshot.data ?? [])
|
||||||
|
sneeex marked this conversation as resolved
Outdated
|
|||||||
|
..sort((a, b) => b.createdAt.compareTo(a.createdAt));
|
||||||
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 16.0),
|
padding: const EdgeInsets.symmetric(vertical: 16.0),
|
||||||
child: InfoTile(
|
child: InfoTile(
|
||||||
width: constraints.maxWidth * 0.95,
|
width: constraints.maxWidth * 0.95,
|
||||||
title: 'Recent Games',
|
title: 'Recent Games',
|
||||||
icon: Icons.timer,
|
icon: Icons.timer,
|
||||||
content: const Padding(
|
content: Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 40.0),
|
padding: EdgeInsets.symmetric(horizontal: 40.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
GameTile(
|
GameTile(
|
||||||
gameTitle: 'Gamenight',
|
gameTitle: games[0].name,
|
||||||
gameType: 'Cabo',
|
gameType: "Gametype",
|
||||||
ruleset: 'Lowest Points',
|
ruleset: 'Ruleset',
|
||||||
players: '5 Players',
|
players: _getPlayerText(games[0]),
|
||||||
winner: 'Leonard',
|
winner:
|
||||||
|
'Leonard', //TODO: Replace Winner with real Winner
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.symmetric(vertical: 8.0),
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
||||||
child: Divider(),
|
child: Divider(),
|
||||||
),
|
),
|
||||||
GameTile(
|
GameTile(
|
||||||
gameTitle: 'Schoolbreak',
|
gameTitle: games[1].name,
|
||||||
gameType: 'Uno',
|
gameType: 'Gametype',
|
||||||
ruleset: 'Highest Points',
|
ruleset: 'Ruleset',
|
||||||
players: 'The Gang',
|
players: _getPlayerText(games[1]),
|
||||||
winner: 'Lina',
|
winner:
|
||||||
|
'Lina', //TODO: Replace Winner with real Winner
|
||||||
|
sneeex marked this conversation as resolved
Outdated
flixcoo
commented
Lieber sowas wie Lieber sowas wie `Game in Progress` oder so
|
|||||||
),
|
),
|
||||||
SizedBox(height: 8),
|
SizedBox(height: 8),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
InfoTile(
|
InfoTile(
|
||||||
width: constraints.maxWidth * 0.95,
|
width: constraints.maxWidth * 0.95,
|
||||||
@@ -189,4 +251,14 @@ class _HomeViewState extends State<HomeView> {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _getPlayerText(Game game) {
|
||||||
|
if (game.group == null) {
|
||||||
|
return game.players?.map((p) => p.name).join(', ') ?? 'No Players';
|
||||||
|
}
|
||||||
|
if (game.players == null || game.players!.isEmpty) {
|
||||||
|
return game.group!.name;
|
||||||
|
}
|
||||||
|
return '${game.group!.name} + ${game.players!.length}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user
Fehler taucht auf, wenn man die App startet. Könnte an dieser Zeile liegen. Ggf. die Skeleton Daten in der gleichen Variable wie die reelen Daten speichern und dann überhscreiben, wenn diese geladen sind