-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
307 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import 'dart:developer'; | ||
|
||
import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||
import 'package:shared_preferences/shared_preferences.dart'; | ||
|
||
part 'preference_manager.g.dart'; | ||
|
||
typedef PreferenceKey = String; | ||
|
||
class PreferenceManager { | ||
final SharedPreferences _prefs; | ||
|
||
PreferenceManager(this._prefs); | ||
|
||
Future<bool> setData<T>(T data, PreferenceKey key) async { | ||
const invalidTypeError = 'Invalid Type'; | ||
assert( | ||
T == String || T == bool || T == int || T == double || T == List<String>, | ||
invalidTypeError, | ||
); | ||
log('data: $data'); | ||
|
||
final setFuncs = <Type, Future<bool> Function()>{ | ||
String: () => _prefs.setString(key, data as String), | ||
bool: () => _prefs.setBool(key, data as bool), | ||
int: () => _prefs.setInt(key, data as int), | ||
double: () => _prefs.setDouble(key, data as double), | ||
List<String>: () => _prefs.setStringList(key, data as List<String>), | ||
}; | ||
|
||
final result = await (setFuncs[T] ?? () async => false)(); | ||
return result; | ||
} | ||
|
||
T? getData<T>(PreferenceKey key) { | ||
const invalidTypeError = 'Invalid Type'; | ||
assert( | ||
T == String || T == bool || T == int || T == double || T == List<String>, | ||
invalidTypeError, | ||
); | ||
|
||
final getFuncs = <Type, T? Function()>{ | ||
String: () => _prefs.getString(key) as T?, | ||
bool: () => _prefs.getBool(key) as T?, | ||
int: () => _prefs.getInt(key) as T?, | ||
double: () => _prefs.getDouble(key) as T?, | ||
List<String>: () => _prefs.getStringList(key) as T?, | ||
}; | ||
|
||
final data = getFuncs[T]?.call(); | ||
return data; | ||
} | ||
} | ||
|
||
@riverpod | ||
PreferenceManager preferenceManager(PreferenceManagerRef ref) { | ||
final prefs = ref.read(sharedPreferencesProvider).requireValue; | ||
return PreferenceManager(prefs); | ||
} | ||
|
||
@Riverpod(keepAlive: true) | ||
Future<SharedPreferences> sharedPreferences(SharedPreferencesRef ref) { | ||
return SharedPreferences.getInstance(); | ||
} |
112 changes: 109 additions & 3 deletions
112
lib/src/widgets/settings/calendar_language_list_tile.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,124 @@ | ||
import 'dart:developer'; | ||
|
||
import 'package:flutter/material.dart'; | ||
import 'package:flutter_mmcalendar/flutter_mmcalendar.dart'; | ||
import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||
import 'package:iconly/iconly.dart'; | ||
import 'package:mmcalendar/src/utils/shared_prefs/preference_manager.dart'; | ||
import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||
|
||
part 'calendar_language_list_tile.g.dart'; | ||
|
||
const PreferenceKey keyCalendarLang = 'key_cal_lang'; | ||
|
||
class CalendarLanguageListTile extends StatelessWidget { | ||
class CalendarLanguageListTile extends HookConsumerWidget { | ||
const CalendarLanguageListTile({ | ||
super.key, | ||
}); | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
Widget build(BuildContext context, WidgetRef ref) { | ||
final language = ref.watch(calendarLanguageControllerProvider); | ||
|
||
void changeCalendarLanguage(Language lang) { | ||
ref | ||
.read(calendarLanguageControllerProvider.notifier) | ||
.setCalendarLanguage(lang); | ||
Navigator.of(context).pop(); | ||
} | ||
|
||
void handleTap() { | ||
showAdaptiveDialog( | ||
context: context, | ||
builder: (context) => AlertDialog( | ||
title: const Text('Theme'), | ||
content: Column( | ||
mainAxisSize: MainAxisSize.min, | ||
children: [ | ||
ListTile( | ||
onTap: () => changeCalendarLanguage(Language.myanmar), | ||
title: const Text('Myanmar (Unicode)'), | ||
trailing: language == Language.myanmar | ||
? const Icon(Icons.check_outlined, color: Colors.green) | ||
: null, | ||
), | ||
ListTile( | ||
onTap: () => changeCalendarLanguage(Language.zawgyi), | ||
title: const Text('Myanmar (Zawgyi)'), | ||
trailing: language == Language.zawgyi | ||
? const Icon(Icons.check_outlined, color: Colors.green) | ||
: null, | ||
), | ||
ListTile( | ||
onTap: () => changeCalendarLanguage(Language.english), | ||
title: const Text('English'), | ||
trailing: language == Language.english | ||
? const Icon(Icons.check_outlined, color: Colors.green) | ||
: null, | ||
), | ||
ListTile( | ||
onTap: () => changeCalendarLanguage(Language.karen), | ||
title: const Text('Karen'), | ||
trailing: language == Language.karen | ||
? const Icon(Icons.check_outlined, color: Colors.green) | ||
: null, | ||
), | ||
ListTile( | ||
onTap: () => changeCalendarLanguage(Language.mon), | ||
title: const Text('Mon'), | ||
trailing: language == Language.mon | ||
? const Icon(Icons.check_outlined, color: Colors.green) | ||
: null, | ||
), | ||
ListTile( | ||
onTap: () => changeCalendarLanguage(Language.tai), | ||
title: const Text('Tai'), | ||
trailing: language == Language.tai | ||
? const Icon(Icons.check_outlined, color: Colors.green) | ||
: null, | ||
), | ||
], | ||
), | ||
), | ||
); | ||
} | ||
|
||
return ListTile( | ||
onTap: () {}, | ||
onTap: handleTap, | ||
leading: const Icon(IconlyLight.calendar), | ||
title: const Text('Calendar Language'), | ||
subtitle: const Text('English, myanmar, karen ...'), | ||
); | ||
} | ||
} | ||
|
||
@Riverpod(keepAlive: true) | ||
class CalendarLanguageController extends _$CalendarLanguageController { | ||
Language _getLanguageFromCached() { | ||
final prefs = ref.read(preferenceManagerProvider); | ||
|
||
final language = prefs.getData<String>(keyCalendarLang); | ||
log('lang: $language'); | ||
|
||
return switch (language) { | ||
'Language.english' => Language.english, | ||
'Language.karen' => Language.karen, | ||
'Language.mon' => Language.mon, | ||
'Language.tai' => Language.tai, | ||
'Language.zawgyi' => Language.zawgyi, | ||
_ => Language.myanmar, | ||
}; | ||
} | ||
|
||
@override | ||
Language build() { | ||
return _getLanguageFromCached(); | ||
} | ||
|
||
void setCalendarLanguage(Language language) { | ||
final prefs = ref.read(preferenceManagerProvider); | ||
prefs.setData<String>(language.toString(), keyCalendarLang); | ||
|
||
state = _getLanguageFromCached(); | ||
} | ||
} |
Oops, something went wrong.