Extract some logic to their own widgets

This commit is contained in:
Roland Geider
2025-10-06 12:43:05 +02:00
parent 2c963522ad
commit 136d0e0825
5 changed files with 109 additions and 89 deletions

View File

@@ -18,12 +18,11 @@
//import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/providers/nutrition.dart';
import 'package:wger/providers/user.dart';
import 'package:wger/screens/configure_plates_screen.dart';
import 'package:wger/widgets/core/settings/exercise_cache.dart';
import 'package:wger/widgets/core/settings/ingredient_cache.dart';
import 'package:wger/widgets/core/settings/theme.dart';
class SettingsPage extends StatelessWidget {
static String routeName = '/SettingsPage';
@@ -33,8 +32,6 @@ class SettingsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final i18n = AppLocalizations.of(context);
final nutritionProvider = Provider.of<NutritionPlansProvider>(context, listen: false);
final userProvider = Provider.of<UserProvider>(context);
return Scaffold(
appBar: AppBar(title: Text(i18n.settingsTitle)),
@@ -44,50 +41,9 @@ class SettingsPage extends StatelessWidget {
title: Text(i18n.settingsCacheTitle, style: Theme.of(context).textTheme.headlineSmall),
),
const SettingsExerciseCache(),
ListTile(
title: Text(i18n.settingsIngredientCacheDescription),
subtitle: Text('${nutritionProvider.ingredients.length} cached ingredients'),
trailing: IconButton(
key: const ValueKey('cacheIconIngredients'),
icon: const Icon(Icons.delete),
onPressed: () async {
await nutritionProvider.clearIngredientCache();
if (context.mounted) {
final snackBar = SnackBar(content: Text(i18n.settingsCacheDeletedSnackbar));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
},
),
),
const SettingsIngredientCache(),
ListTile(title: Text(i18n.others, style: Theme.of(context).textTheme.headlineSmall)),
ListTile(
title: Text(i18n.themeMode),
trailing: DropdownButton<ThemeMode>(
key: const ValueKey('themeModeDropdown'),
value: userProvider.themeMode,
onChanged: (ThemeMode? newValue) {
if (newValue != null) {
userProvider.setThemeMode(newValue);
}
},
items: ThemeMode.values.map<DropdownMenuItem<ThemeMode>>((ThemeMode value) {
final label = (() {
switch (value) {
case ThemeMode.system:
return i18n.systemMode;
case ThemeMode.light:
return i18n.lightMode;
case ThemeMode.dark:
return i18n.darkMode;
}
})();
return DropdownMenuItem<ThemeMode>(value: value, child: Text(label));
}).toList(),
),
),
const SettingsTheme(),
ListTile(
title: Text(i18n.selectAvailablePlates),
onTap: () {

View File

@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/providers/nutrition.dart';
class SettingsIngredientCache extends StatelessWidget {
const SettingsIngredientCache({super.key});
@override
Widget build(BuildContext context) {
final i18n = AppLocalizations.of(context);
final nutritionProvider = Provider.of<NutritionPlansProvider>(context, listen: false);
return ListTile(
title: Text(i18n.settingsIngredientCacheDescription),
subtitle: Text('${nutritionProvider.ingredients.length} cached ingredients'),
trailing: IconButton(
key: const ValueKey('cacheIconIngredients'),
icon: const Icon(Icons.delete),
onPressed: () async {
await nutritionProvider.clearIngredientCache();
if (context.mounted) {
final snackBar = SnackBar(content: Text(i18n.settingsCacheDeletedSnackbar));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
},
),
);
}
}

View File

@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/providers/user.dart';
class SettingsTheme extends StatelessWidget {
const SettingsTheme({super.key});
@override
Widget build(BuildContext context) {
final i18n = AppLocalizations.of(context);
final userProvider = Provider.of<UserProvider>(context);
return ListTile(
title: Text(i18n.themeMode),
trailing: DropdownButton<ThemeMode>(
key: const ValueKey('themeModeDropdown'),
value: userProvider.themeMode,
onChanged: (ThemeMode? newValue) {
if (newValue != null) {
userProvider.setThemeMode(newValue);
}
},
items: ThemeMode.values.map<DropdownMenuItem<ThemeMode>>((ThemeMode value) {
final label = (() {
switch (value) {
case ThemeMode.system:
return i18n.systemMode;
case ThemeMode.light:
return i18n.lightMode;
case ThemeMode.dark:
return i18n.darkMode;
}
})();
return DropdownMenuItem<ThemeMode>(value: value, child: Text(label));
}).toList(),
),
);
}
}