Group View erstellt #22

Merged
sneeex merged 29 commits from feature/4-groupview-erstellen into development 2025-11-16 20:50:24 +00:00
3 changed files with 134 additions and 56 deletions
Showing only changes of commit d08c79fc26 - Show all commits

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
//import 'package:game_tracker/data/dto/group.dart'; //import 'package:game_tracker/data/dto/group.dart';
//import 'package:game_tracker/data/dto/player.dart'; //import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/widgets/full_width_button.dart'; import 'package:game_tracker/presentation/widgets/full_width_button.dart';
import 'package:game_tracker/presentation/widgets/group_tile.dart';
import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart';
class Group { class Group {
@@ -38,7 +39,15 @@ class _GroupsViewState extends State<GroupsView> {
Group( Group(
id: 'g1', id: 'g1',
name: 'Weekend Warriors', name: 'Weekend Warriors',
members: [player1, player2, player4], members: [
player1,
player2,
player4,
player3,
player1,
player4,
player2,
],
), ),
Group(id: 'g2', name: 'Strategy Masters', members: [player3, player4]), Group(id: 'g2', name: 'Strategy Masters', members: [player3, player4]),
Group( Group(
@@ -46,41 +55,85 @@ class _GroupsViewState extends State<GroupsView> {
name: 'The Cardboard Crew', name: 'The Cardboard Crew',
members: [player1, player2, player3, player4], members: [player1, player2, player3, player4],
), ),
Group(id: 'g4', name: 'The Group', members: [player1, player3, player4]), Group(
id: 'g4',
name: 'Gamers',
sneeex marked this conversation as resolved Outdated

Finde die Nachricht ist zu groß, bisschen dezenter wäre gut, ggf. mit Icon ergänzen oder so

Finde die Nachricht ist zu groß, bisschen dezenter wäre gut, ggf. mit Icon ergänzen oder so
members: [player1, player3, player1, player4],
),
Group(
id: 'g4',
name: 'The Group',
members: [player4, player1, player3, player4, player3],
),
Group(
id: 'g4',
name: 'Friends',
members: [player4, player1, player3, player4],
),
Group(
id: 'g4',
name: 'Sample Group',
members: [player1, player1, player4, player3],
),
Group(
id: 'g4',
name: 'The Group',
members: [player1, player1, player3, player4],
),
Group(
id: 'g4',
name: 'The Best',
members: [player1, player3, player1, player4, player1],
),
]; ];
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return SafeArea(
child: Stack(
children: [ children: [
FutureBuilder( FutureBuilder(
future: _getMockGroups(), future: _getMockGroups(),
builder: (BuildContext context, AsyncSnapshot<List<Group>> snapshot) { builder:
(BuildContext context, AsyncSnapshot<List<Group>> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return Center( return const Center(
child: TopCenteredMessage( child: TopCenteredMessage(
message: "Data not yet available, show sceleton", message: 'Data not yet available, show sceleton',
), ),
); );
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
return Center( return const Center(
child: TopCenteredMessage( child: TopCenteredMessage(
message: "Error while loading group data.", message: 'Error while loading group data.',
), ),
); );
} else if (!snapshot.hasData || snapshot.data!.isEmpty) { } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return Center( return const Center(
child: TopCenteredMessage(message: "No groups created yet."), child: TopCenteredMessage(
message: 'No groups created yet.',
),
); );
} }
return Center(child: Text("whatever")); //return Center(child: Text('whatever'));
//return GroupTile(group: snapshot.data![0]); //return GroupTile(group: snapshot.data![0]);
//return ListView.builder() return ListView.builder(
padding: const EdgeInsets.only(bottom: 85),
itemCount: snapshot.data!.length,
itemBuilder: (BuildContext context, int index) {
return GroupTile(group: snapshot.data![index]);
},
);
}, },
), ),
FullWidthButton(text: "Create Group", onPressed: () {}), Positioned(
bottom: 16,
right: 16,
child: FullWidthButton(text: 'Create Group', onPressed: () {}),
),
], ],
),
); );
} }
} }

View File

@@ -12,7 +12,7 @@ class FullWidthButton extends StatelessWidget {
return ElevatedButton( return ElevatedButton(
onPressed: onPressed, onPressed: onPressed,
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
minimumSize: Size(MediaQuery.of(context).size.width * 0.8, 60), minimumSize: Size(MediaQuery.of(context).size.width * 0.90, 60),
backgroundColor: CustomTheme.primaryColor, backgroundColor: CustomTheme.primaryColor,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
), ),

View File

@@ -1,20 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
//import 'package:game_tracker/data/dto/group.dart'; import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/presentation/views/main_menu/groups_view.dart';
class Group {
final String id;
final String name;
final List<Player> members;
Group({required this.id, required this.name, required this.members});
}
class Player {
final String id;
final String name;
Player({required this.id, required this.name});
}
class GroupTile extends StatelessWidget { class GroupTile extends StatelessWidget {
const GroupTile({super.key, required this.group}); const GroupTile({super.key, required this.group});
@@ -24,31 +10,70 @@ class GroupTile extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
width: MediaQuery.of(context).size.width * 0.90,
sneeex marked this conversation as resolved Outdated

Die ganzen Inhalte der GroupTile wirken im gegensatz zu den HomeView Elementen sehr groß, ggf. hier nochmal Größen anpassen. Und am besten wäre auch wenn die Tiles die gleiche Breite haben wie in der HomeView.

Die ganzen Inhalte der `GroupTile` wirken im gegensatz zu den `HomeView` Elementen sehr groß, ggf. hier nochmal Größen anpassen. Und am besten wäre auch wenn die Tiles die gleiche Breite haben wie in der HomeView.
margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
decoration: BoxDecoration(
color: CustomTheme.secondaryColor,
borderRadius: BorderRadius.circular(12),
),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text("${group.name}", overflow: TextOverflow.ellipsis), Text(
Text("${group.members.length}"), group.name,
Icon(Icons.group), overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
color: Colors.white,
),
),
const Spacer(),
Text(
'${group.members.length}',
style: const TextStyle(
fontWeight: FontWeight.w900,
fontSize: 20,
color: Colors.white,
),
),
SizedBox(width: 3),
const Icon(Icons.group),
], ],
), ),
SizedBox(height: 5),
Wrap( Wrap(
spacing: 8.0, alignment: WrapAlignment.start,
runSpacing: -4.0, crossAxisAlignment: WrapCrossAlignment.start,
spacing: 12.0,
runSpacing: 8.0,
children: <Widget>[ children: <Widget>[
for (var member in group.members) for (var member in group.members)
Container( Container(
color: Colors.grey, padding: const EdgeInsets.symmetric(
padding: const EdgeInsets.all(4.0), vertical: 5,
horizontal: 10,
),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black26,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
), ),
child: Text(member.name), child: Text(
member.name,
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
), ),
], ],
), ),
SizedBox(height: 2.5),
], ],
), ),
); );