Skip to content

Instantly share code, notes, and snippets.

@pmutisya
Created September 16, 2019 23:29
implementing theme preferences in Flutter
import 'package:shared_preferences/shared_preferences.dart';
enum Themes {
DARK, LIGHT, SYSTEM
}
class Prefs {
static const Map<Themes, String> themes = {
Themes.DARK: "Dark", Themes.LIGHT : "Light", Themes.SYSTEM : "System"
};
Map<String, List<PrefsListener>> _listeners;
factory Prefs.singleton() {
return _instance;
}
static final Prefs _instance = Prefs._internal();
SharedPreferences _prefs;
bool _initialized = false;
static const String THEME_PREF = "AppTheme";
Prefs._internal() {
_listeners = Map<String, List<PrefsListener>>();
_getPrefs().then((prefs) {
_initialized = true;
for (String key in _listeners.keys) {
List<PrefsListener> listeners = _listeners[key];
if(listeners != null && listeners.isNotEmpty) {
Object value = prefs.get(key);
for (PrefsListener listener in listeners) {
listener(key, value);
}
}
}
});
}
void addListenerForPref(String key, PrefsListener listener) {
List<PrefsListener> list = _listeners[key];
if (list == null) {
list = List<PrefsListener>();
_listeners[key] = list;
}
list.add(listener);
}
Future<SharedPreferences> _getPrefs() async {
if (_prefs == null) {
_prefs = await SharedPreferences.getInstance();
}
return _prefs;
}
String getTheme() {
if (_initialized) {
String theme = _prefs.getString(THEME_PREF);
if (theme != null) {
return theme;
}
else {
_prefs.setString(THEME_PREF, themes[Themes.SYSTEM]); //ok not to wait
return themes[Themes.SYSTEM];
}
}
else {
return themes[Themes.SYSTEM];
}
}
//called when the user updates the operating system theme
//(by choosing light or dark mode)
void systemThemeUpdated(Brightness brightness) {
if (isSystemTheme()) {
String theme = getTheme();
List<PrefsListener> listenerList = _listeners[THEME_PREF];
if (listenerList != null) {
for (PrefsListener listener in listenerList) {
listener(THEME_PREF, theme);
}
}
}
}
///set the app's theme preference from the
///app's own UI
void setTheme(String theme) {
_getPrefs().then((prefs) {
prefs.setString(THEME_PREF, theme);
});
List<PrefsListener> listenerList = _listeners[THEME_PREF];
if (listenerList != null) {
for (PrefsListener listener in listenerList) {
listener(THEME_PREF, theme);
}
}
}
}
typedef PrefsListener(String key, Object value);
@Raj-Dave368
Copy link

image

@Raj-Dave368
Copy link

Please reply soon

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment