trainlog-egu5j / lib /src /presentation /providers /settings_provider.dart
kuubson's picture
Zaprojektuj i wygeneruj kompletną aplikację Flutter (Dart) działającą na iOS, o nazwie TrainLog: dziennik treningu i śledzenie progresu siłowego/sylwetkowego. Aplikacja ma działać offline-first (bez b
afe1e75 verified
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
final settingsProvider = StateNotifierProvider<SettingsNotifier, Settings>((ref) {
return SettingsNotifier();
});
class Settings {
final bool useKg;
final ThemeMode themeMode;
final bool showDemoData;
const Settings({
this.useKg = true,
this.themeMode = ThemeMode.system,
this.showDemoData = false,
});
Settings copyWith({
bool? useKg,
ThemeMode? themeMode,
bool? showDemoData,
}) {
return Settings(
useKg: useKg ?? this.useKg,
themeMode: themeMode ?? this.themeMode,
showDemoData: showDemoData ?? this.showDemoData,
);
}
}
class SettingsNotifier extends StateNotifier<Settings> {
late SharedPreferences _prefs;
SettingsNotifier() : super(const Settings()) {
_loadSettings();
}
Future<void> _loadSettings() async {
_prefs = await SharedPreferences.getInstance();
state = Settings(
useKg: _prefs.getBool('useKg') ?? true,
themeMode: ThemeMode.values[_prefs.getInt('themeMode') ?? 0],
showDemoData: _prefs.getBool('showDemoData') ?? false,
);
}
Future<void> setUseKg(bool value) async {
await _prefs.setBool('useKg', value);
state = state.copyWith(useKg: value);
}
Future<void> setThemeMode(ThemeMode mode) async {
await _prefs.setInt('themeMode', mode.index);
state = state.copyWith(themeMode: mode);
}
Future<void> setShowDemoData(bool value) async {
await _prefs.setBool('showDemoData', value);
state = state.copyWith(showDemoData: value);
}
Future<void> resetSettings() async {
await _prefs.clear();
state = const Settings();
}
}