mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
Extract some logic to their own widgets
This commit is contained in:
@@ -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: () {
|
||||
|
||||
32
lib/widgets/core/settings/ingredient_cache.dart
Normal file
32
lib/widgets/core/settings/ingredient_cache.dart
Normal 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);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
41
lib/widgets/core/settings/theme.dart
Normal file
41
lib/widgets/core/settings/theme.dart
Normal 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(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user