first commit

This commit is contained in:
Patryk Hegenberg 2025-06-16 18:56:34 +02:00
commit a2663f415e
144 changed files with 6324 additions and 0 deletions

View file

@ -0,0 +1,178 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:kettlebell_tracker/providers/settings_provider.dart';
import 'package:kettlebell_tracker/theme/app_theme.dart';
import 'package:kettlebell_tracker/widgets/custom_card.dart';
import 'package:kettlebell_tracker/widgets/custom_text_field.dart';
class SettingsScreen extends ConsumerStatefulWidget {
const SettingsScreen({super.key});
@override
ConsumerState<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends ConsumerState<SettingsScreen> {
final _formKey = GlobalKey<FormState>();
late TextEditingController _trainingTimeController;
late TextEditingController _weightLeftController;
late TextEditingController _weightRightController;
late TextEditingController _repsController;
late TextEditingController _goalSetsController;
late TextEditingController _notesController;
@override
void initState() {
super.initState();
final settings = ref.read(settingsProvider);
_trainingTimeController = TextEditingController(
text: settings.trainingTimeMinutes.toString(),
);
_weightLeftController = TextEditingController(
text: settings.weightLeft.toString(),
);
_weightRightController = TextEditingController(
text: settings.weightRight.toString(),
);
_repsController = TextEditingController(
text: settings.repsPerSet.toString(),
);
_goalSetsController = TextEditingController(
text: settings.goalSets.toString(),
);
_notesController = TextEditingController(text: settings.notes);
}
@override
void dispose() {
_trainingTimeController.dispose();
_weightLeftController.dispose();
_weightRightController.dispose();
_repsController.dispose();
_goalSetsController.dispose();
_notesController.dispose();
super.dispose();
}
void _saveSettings() {
if (_formKey.currentState!.validate()) {
final newSettings = SettingsState(
trainingTimeMinutes: int.parse(_trainingTimeController.text),
weightLeft: double.parse(_weightLeftController.text),
weightRight: double.parse(_weightRightController.text),
repsPerSet: int.parse(_repsController.text),
goalSets: int.parse(_goalSetsController.text),
notes: _notesController.text,
);
ref.read(settingsProvider.notifier).updateSettings(newSettings);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Einstellungen gespeichert!'),
backgroundColor: AppTheme.oneDarkGreen,
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Bitte korrigiere die Fehler.'),
backgroundColor: AppTheme.oneDarkRed,
),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Einstellungen')),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
CustomCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Trainingsparameter",
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 20),
CustomTextField(
controller: _trainingTimeController,
labelText: "Trainingszeit (Minuten)",
icon: Icons.timer,
keyboardType: TextInputType.number,
),
const SizedBox(height: 16),
CustomTextField(
controller: _weightLeftController,
labelText: "Linke Kettlebell (kg)",
icon: Icons.fitness_center,
keyboardType: TextInputType.number,
),
const SizedBox(height: 16),
CustomTextField(
controller: _weightRightController,
labelText: "Rechte Kettlebell (kg)",
icon: Icons.fitness_center,
keyboardType: TextInputType.number,
),
const SizedBox(height: 16),
CustomTextField(
controller: _repsController,
labelText: "Reps pro Satz",
icon: Icons.repeat,
keyboardType: TextInputType.number,
),
const SizedBox(height: 16),
CustomTextField(
controller: _goalSetsController,
labelText: "Ziel-Sätze",
icon: Icons.flag,
keyboardType: TextInputType.number,
),
],
),
),
const SizedBox(height: 20),
CustomCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Zusätzliche Notizen",
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 20),
CustomTextField(
controller: _notesController,
labelText: "Notizen für nächstes Training",
icon: Icons.note,
maxLines: 4,
),
],
),
),
const SizedBox(height: 24),
ElevatedButton.icon(
onPressed: _saveSettings,
icon: const Icon(Icons.save),
label: const Text('Einstellungen speichern'),
style: ElevatedButton.styleFrom(
backgroundColor: AppTheme.oneDarkPrimary,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 16),
),
),
],
),
),
),
);
}
}