CreateGroupView erstellt #28
2 Participants
Notifications
Due Date
No due date set.
Depends on
#35 UUID-Generierung für Objekte
liquid-development/game-tracker
Reference: liquid-development/game-tracker#28
Reference in New Issue
Block a user
Delete Branch "feature/5-creategroupview-erstellen"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
CreateGroupView erstellt
Zugehörige Issue(s):
#5
Beschreibung
Neue Ansicht zum Erstellen von Gruppen. Nutzer können einen Gruppennamen eingeben, Spieler suchen, auswählen und die Gruppe anschließend speichern.
Änderungen
CreateGroupView hinzugefügt (mit Spieler-Suche, Auswahl & Skeleton-Loading).
Erfolgs- und Fehlermeldungen (SnackBar, Info-/Error-Widgets).
Zusätzliche Anmerkungen
//
todo:
//
erledigt
WIP: CreateGroupView erstelltto CreateGroupView erstelltCreateGroupView erstelltto WIP: CreateGroupView erstelltMach die ID doch direkt über UUID.v4() (ist glaub ich das sinnvollste)
https://pub.dev/packages/uuid
wäre es nicht eigentlich logischer die uuid im datenbank file zu generieren? oder was ist das problem daran? also ich meine wenn es sowieso uuids sind, die ich nicht selbst setze, dann ist doch direkt im addgroup in groupDao viel schlauer?
Wäre es dann wiederum nicht am schlausten die in der jeweiligen Klasse zu generieren, falls keine ID übergeben wird?
ja so deep bin ich jetzt nicht drin, du meinst dann in den player group und game klassen?
weiß nicht
@gelbeinhalb deine meinung?
also ich würde sie auch nicht übergebbar machen, sondern ja vielleicht einfach dann in den klassen generieren, weil das ist ja das niedrigste level was quasi geht oder?
Du musst sie aber übergebbar machen, damit man aus den Infos aus der Datenbank korrekte Objekte erstellt und nicht die ID sich jedes Mal beim rausholen ändern. Du machst einfach ne Stamdard-Zuweisung in den DTOs aber trotzdem noch übergebbar für die DAO Klassen
Ja stimmt
WIP: CreateGroupView erstelltto CreateGroupView erstellt@@ -0,0 +28,4 @@late Future<List<Player>> _allPlayersFuture;late final List<Player> skeletonData = List.filled(7,Player(id: '0', name: 'Player 0'),id nach #35 nicht mehr notwendig
@@ -0,0 +56,4 @@backgroundColor: CustomTheme.backgroundColor,scrolledUnderElevation: 0,title: const Text("Create new group",Single Quotes
@@ -0,0 +57,4 @@scrolledUnderElevation: 0,title: const Text("Create new group",style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),constunnötig@@ -0,0 +94,4 @@children: [CustomSearchBar(controller: _searchBarController,constraints: BoxConstraints(maxHeight: 45, minHeight: 45),constraints: const BoxConstraints(...@@ -0,0 +95,4 @@CustomSearchBar(controller: _searchBarController,constraints: BoxConstraints(maxHeight: 45, minHeight: 45),hintText: "Search for players",single quotes
@@ -0,0 +115,4 @@});},),SizedBox(height: 10),const SizedBox()@@ -0,0 +117,4 @@),SizedBox(height: 10),Text("Ausgewählte Spieler: (${selectedPlayers.length})",single quotes
@@ -0,0 +118,4 @@SizedBox(height: 10),Text("Ausgewählte Spieler: (${selectedPlayers.length})",style: TextStyle(const TextStyle()@@ -0,0 +123,4 @@fontWeight: FontWeight.bold,),),SizedBox(height: 10),const SizedBox()@@ -0,0 +130,4 @@spacing: 8.0,runSpacing: 8.0,children: <Widget>[for (var selectedPlayer in selectedPlayers)lieber
var player in selectedPlayers?@@ -0,0 +153,4 @@),],),SizedBox(height: 10),const SizedBox()@@ -0,0 +155,4 @@),SizedBox(height: 10),Text("Alle Spieler:",single quotes
@@ -0,0 +156,4 @@SizedBox(height: 10),Text("Alle Spieler:",style: TextStyle(const TextStyle@@ -0,0 +161,4 @@fontWeight: FontWeight.bold,),),SizedBox(height: 10),const SizedBox()@@ -0,0 +216,4 @@),child:(suggestedPlayers.isEmpty &&!allPlayers.isEmpty)Lieber
isNotEmpty@@ -0,0 +264,4 @@),),FullWidthButton(text: "Create group",single quotes
@@ -0,0 +267,4 @@text: "Create group",infillColor: CustomTheme.primaryColor,borderColor: CustomTheme.primaryColor,disabledInfillColor: CustomTheme.boxColor,Button sieht deaktiviert aus wie ein SecondaryButton, styling anpassen. Ggf. Attribut festlegen, welches festlegt ob Button primary styling oder secondary styling hat
@@ -0,0 +275,4 @@: () async {bool success = await db.groupDao.addGroup(group: Group(id: Uuid().v4(),constbzw #35 reinmergen und weglassen@@ -0,0 +284,4 @@_groupNameController.clear();_searchBarController.clear();selectedPlayers.clear();Navigator.pop(context);Bei asynchronen aufgaben
mountedcheck@@ -0,0 +286,4 @@selectedPlayers.clear();Navigator.pop(context);} else {ScaffoldMessenger.of(context).showSnackBar(mountedcheck@@ -0,0 +289,4 @@ScaffoldMessenger.of(context).showSnackBar(SnackBar(backgroundColor: CustomTheme.boxColor,content: Center(const@@ -0,0 +291,4 @@backgroundColor: CustomTheme.boxColor,content: Center(child: Text("Error while creating group, please try again",single quotes
@@ -0,0 +301,4 @@setState(() {});},),SizedBox(height: 20),const@@ -0,0 +23,4 @@constraints ?? const BoxConstraints(maxHeight: 45, minHeight: 45),hintText: hintText,onChanged: onChanged,hintStyle: MaterialStateProperty.all(const TextStyle(fontSize: 16)),MaterialStatePropertyist deprecated@@ -0,0 +25,4 @@onChanged: onChanged,hintStyle: MaterialStateProperty.all(const TextStyle(fontSize: 16)),leading: const Icon(Icons.search),backgroundColor: MaterialStateProperty.all(CustomTheme.boxColor),MaterialStateProperty ist deprecated
@@ -0,0 +26,4 @@hintStyle: MaterialStateProperty.all(const TextStyle(fontSize: 16)),leading: const Icon(Icons.search),backgroundColor: MaterialStateProperty.all(CustomTheme.boxColor),side: MaterialStateProperty.all(BorderSide(color: CustomTheme.boxBorder)),MaterialStateProperty ist deprecated
@@ -0,0 +27,4 @@leading: const Icon(Icons.search),backgroundColor: MaterialStateProperty.all(CustomTheme.boxColor),side: MaterialStateProperty.all(BorderSide(color: CustomTheme.boxBorder)),shape: MaterialStateProperty.all(MaterialStateProperty ist deprecated
@@ -0,0 +30,4 @@shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),),elevation: MaterialStateProperty.all(0),MaterialStateProperty ist deprecated
@@ -3,3 +2,3 @@class FullWidthButton extends StatelessWidget {const FullWidthButton({super.key, required this.text, this.onPressed});const FullWidthButton({Ist nicht mehr FullWidth, deswegen anderer Name oder
sizeRelativeToWidthOptional@@ -0,0 +1,42 @@import 'package:flutter/material.dart';import 'package:game_tracker/core/custom_theme.dart';class IconListTile extends StatelessWidget {Klassenname stimmt nicht mit Dateiname überein
@@ -0,0 +3,4 @@class IconListTile extends StatelessWidget {final String text;final IconData icon;Falls das Icon bisher nur ein Icon ist, ggf. nur das Icon deaktivierbar machen anstatt es komplett selbst zu setzen
@@ -0,0 +3,4 @@class TextIconTile extends StatelessWidget {final String text;final IconData? icon;Falls das Icon bisher nur ein Icon ist, ggf. nur das Icon deaktivierbar machen anstatt es komplett selbst zu setzen
MaterialStatePropertywithWidgetStatePropertyinCustomSearchBar51a8c4ea58@@ -0,0 +276,4 @@name: _groupNameController.text,members: selectedPlayers,),);Füg hier folgende Zeile ein und entferne die anderen beiden
ifsAber wenn's nicht mounted ist, will ich doch trotzdem noch die Felder clearen?
Der Context ist nicht mehr verfügbar, wenn z.B. das Widget garnicht mehr im widget tree ist. Also ist das dann eh egal
@@ -0,0 +7,4 @@const CustomWidthButton({super.key,required this.text,this.disabledInfillColor,Das was aktuell der disabledButton ist sollte lieber der Secondary Button sein. Deaktivierte Buttons sollten grau sein oder sowas, also klar als deaktiviert erkennbar sein.
Erläutere bitte, verstehe ich nicht
Dein Create Game Button sieht, wenn er deaktiviert ist, viel mehr aus wie ein Secondary Button.
Orientiere dich am besten daran:
@@ -0,0 +6,4 @@final VoidCallback onPressed;final bool iconEnabled;const TextIconListTile({Alignment irgendwie komisch, Abstand vom Button zum Rand viel größer als vom Namen zum rand
@@ -0,0 +9,4 @@const TextIconListTile({super.key,required this.text,required this.onPressed,onPressed sollte nich required sein wenn das icon nicht immer zu sehen ist
Was du noch machen könntest wäre einen
buttonsOrdner erstellen und da den full width button und den quick create button reinzutunTextIconListTilepadding and replaceIconButtonwithGestureDetector201fd70685GestureDetectorchild ordering inTextIconListTile1232cb8f0d