first commit
This commit is contained in:
commit
a2663f415e
144 changed files with 6324 additions and 0 deletions
178
lib/screens/settings_screen.dart
Normal file
178
lib/screens/settings_screen.dart
Normal 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),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue