178 lines
6.3 KiB
Dart
178 lines
6.3 KiB
Dart
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),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|