Made Settings persistent with autosave
This commit is contained in:
22
lib/storage/settings/settings.dart
Normal file
22
lib/storage/settings/settings.dart
Normal file
@ -0,0 +1,22 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'settings.g.dart';
|
||||
|
||||
@JsonSerializable(explicitToJson: true)
|
||||
class Settings {
|
||||
@JsonKey(
|
||||
toJson: _themeToJson,
|
||||
fromJson: _themeFromJson,
|
||||
)
|
||||
ThemeMode appTheme;
|
||||
bool devToolsEnabled;
|
||||
|
||||
Settings(this.appTheme, this.devToolsEnabled);
|
||||
|
||||
static String _themeToJson(ThemeMode m) => m.name;
|
||||
static ThemeMode _themeFromJson(String m) => ThemeMode.values.firstWhere((element) => element.name == m);
|
||||
|
||||
factory Settings.fromJson(Map<String, dynamic> json) => _$SettingsFromJson(json);
|
||||
Map<String, dynamic> toJson() => _$SettingsToJson(this);
|
||||
}
|
17
lib/storage/settings/settings.g.dart
Normal file
17
lib/storage/settings/settings.g.dart
Normal file
@ -0,0 +1,17 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'settings.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
Settings _$SettingsFromJson(Map<String, dynamic> json) => Settings(
|
||||
Settings._themeFromJson(json['appTheme'] as String),
|
||||
json['devToolsEnabled'] as bool,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$SettingsToJson(Settings instance) => <String, dynamic>{
|
||||
'appTheme': Settings._themeToJson(instance.appTheme),
|
||||
'devToolsEnabled': instance.devToolsEnabled,
|
||||
};
|
49
lib/storage/settings/settingsProvider.dart
Normal file
49
lib/storage/settings/settingsProvider.dart
Normal file
@ -0,0 +1,49 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'settings.dart';
|
||||
|
||||
class SettingsProvider extends ChangeNotifier {
|
||||
static const String _fieldName = "settings";
|
||||
|
||||
late SharedPreferences _storage;
|
||||
late Settings _settings = _defaults();
|
||||
|
||||
Settings val({bool write = false}) {
|
||||
if(write) {
|
||||
notifyListeners();
|
||||
Future.delayed(const Duration(milliseconds: 300)).then((_) => update());
|
||||
}
|
||||
return _settings;
|
||||
}
|
||||
|
||||
SettingsProvider() {
|
||||
init();
|
||||
}
|
||||
|
||||
void init() async {
|
||||
_storage = await SharedPreferences.getInstance();
|
||||
|
||||
if(_storage.containsKey(_fieldName)) {
|
||||
log("Settings from disk: ${_storage.getString(_fieldName)}");
|
||||
_settings = Settings.fromJson(jsonDecode(_storage.getString(_fieldName)!));
|
||||
} else {
|
||||
_settings = _defaults();
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void update() async {
|
||||
await _storage.setString(_fieldName, jsonEncode(_settings.toJson()));
|
||||
}
|
||||
|
||||
Settings _defaults() {
|
||||
return Settings(
|
||||
ThemeMode.system,
|
||||
false,
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user