more refactor

This commit is contained in:
Christien Rioux 2024-01-08 21:37:08 -05:00
parent ba4ef05a28
commit b83aa3a64b
39 changed files with 722 additions and 514 deletions

View file

@ -0,0 +1,80 @@
import 'dart:async';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
abstract mixin class SharedPreferencesBacked<T> {
SharedPreferences get _sharedPreferences;
String keyName();
T valueFromJson(Object? obj);
Object? valueToJson(T val);
/// Load things from storage
Future<T> load() async {
final valueJsonStr = _sharedPreferences.getString(keyName());
final Object? valueJsonObj =
valueJsonStr != null ? jsonDecode(valueJsonStr) : null;
return valueFromJson(valueJsonObj);
}
/// Store things to storage
Future<T> store(T obj) async {
final valueJsonObj = valueToJson(obj);
if (valueJsonObj == null) {
await _sharedPreferences.remove(keyName());
} else {
await _sharedPreferences.setString(keyName(), jsonEncode(valueJsonObj));
}
return obj;
}
}
class SharedPreferencesValue<T> extends SharedPreferencesBacked<T> {
SharedPreferencesValue({
required SharedPreferences sharedPreferences,
required String keyName,
required T Function(Object? obj) valueFromJson,
required Object? Function(T obj) valueToJson,
}) : _sharedPreferencesInstance = sharedPreferences,
_valueFromJson = valueFromJson,
_valueToJson = valueToJson,
_keyName = keyName,
_streamController = StreamController<T>.broadcast();
@override
SharedPreferences get _sharedPreferences => _sharedPreferencesInstance;
T? get value => _value;
T get requireValue => _value!;
Stream<T> get stream => _streamController.stream;
Future<T> get() async {
final val = _value;
if (val != null) {
return val;
}
final loadedValue = await load();
return _value = loadedValue;
}
Future<void> set(T newVal) async {
_value = await store(newVal);
_streamController.add(newVal);
}
T? _value;
final SharedPreferences _sharedPreferencesInstance;
final String _keyName;
final T Function(Object? obj) _valueFromJson;
final Object? Function(T obj) _valueToJson;
final StreamController<T> _streamController;
//////////////////////////////////////////////////////////////
/// SharedPreferencesBacked
@override
String keyName() => _keyName;
@override
T valueFromJson(Object? obj) => _valueFromJson(obj);
@override
Object? valueToJson(T val) => _valueToJson(val);
}

View file

@ -3,6 +3,7 @@ export 'loggy.dart';
export 'phono_byte.dart';
export 'responsive.dart';
export 'scanner_error_widget.dart';
export 'shared_preferences.dart';
export 'state_logger.dart';
export 'stream_wrapper_cubit.dart';
export 'widget_helpers.dart';

View file

@ -5,6 +5,7 @@ import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:flutter_translate/flutter_translate.dart';
import 'package:motion_toast/motion_toast.dart';
import 'package:quickalert/quickalert.dart';
import 'package:veilid_support/veilid_support.dart';
import '../theme/theme.dart';
@ -41,6 +42,24 @@ Widget waitingPage(BuildContext context) => ColoredBox(
color: Theme.of(context).scaffoldBackgroundColor,
child: Center(child: buildProgressIndicator(context)));
Widget errorPage(BuildContext context, Object err, StackTrace? st) =>
ColoredBox(
color: Theme.of(context).colorScheme.error,
child: Center(child: Text(err.toString())));
Widget asyncValueBuilder<T>(
AsyncValue<T> av, Widget Function(BuildContext, T) builder) =>
av.when(
loading: () => const Builder(builder: waitingPage),
error: (e, st) =>
Builder(builder: (context) => errorPage(context, e, st)),
data: (d) => Builder(builder: (context) => builder(context, d)));
extension AsyncValueBuilderExt<T> on AsyncValue<T> {
Widget builder(Widget Function(BuildContext, T) builder) =>
asyncValueBuilder<T>(this, builder);
}
Future<void> showErrorModal(
BuildContext context, String title, String text) async {
await QuickAlert.show(
@ -135,3 +154,7 @@ Future<T?> showStyledDialog<T>(
borderRadius: BorderRadius.circular(12))),
child: child.paddingAll(0)))));
}
bool get isPlatformDark =>
WidgetsBinding.instance.platformDispatcher.platformBrightness ==
Brightness.dark;

View file

@ -27,14 +27,15 @@ Future<void> initializeWindowControl() async {
skipTaskbar: false,
);
await windowManager.waitUntilReadyToShow(windowOptions, () async {
await _doWindowSetup(TitleBarStyle.hidden, OrientationCapability.normal);
await changeWindowSetup(
TitleBarStyle.hidden, OrientationCapability.normal);
await windowManager.show();
await windowManager.focus();
});
}
}
Future<void> _doWindowSetup(TitleBarStyle titleBarStyle,
Future<void> changeWindowSetup(TitleBarStyle titleBarStyle,
OrientationCapability orientationCapability) async {
if (isDesktop) {
await windowManager.setTitleBarStyle(titleBarStyle);
@ -58,8 +59,3 @@ Future<void> _doWindowSetup(TitleBarStyle titleBarStyle,
}
}
}
Future<void> changeWindowSetup(TitleBarStyle titleBarStyle,
OrientationCapability orientationCapability) async {
await _doWindowSetup(titleBarStyle, orientationCapability);
}