From 301814c6b24e9582baffbe02d2ca438814de5357 Mon Sep 17 00:00:00 2001 From: Vadim Date: Mon, 14 Aug 2023 11:57:16 +0200 Subject: [PATCH] Separated `_ThemeModel` --- lib/application.dart | 6 +- lib/providers/user_preferences_provider.dart | 120 +++++++++++-------- 2 files changed, 72 insertions(+), 54 deletions(-) diff --git a/lib/application.dart b/lib/application.dart index 5c801b1..1249ed9 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -13,7 +13,6 @@ import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; -import 'package:lightmeter/res/theme.dart'; import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart'; import 'package:platform/platform.dart'; @@ -45,10 +44,7 @@ class Application extends StatelessWidget { child: EquipmentProfileProvider( child: Builder( builder: (context) { - final theme = themeFrom( - UserPreferencesProvider.primaryColorOf(context), - UserPreferencesProvider.brightnessOf(context), - ); + final theme = UserPreferencesProvider.themeOf(context); final systemIconsBrightness = ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface); return AnnotatedRegion( diff --git a/lib/providers/user_preferences_provider.dart b/lib/providers/user_preferences_provider.dart index 170945f..9527c14 100644 --- a/lib/providers/user_preferences_provider.dart +++ b/lib/providers/user_preferences_provider.dart @@ -9,6 +9,7 @@ import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/services_provider.dart'; +import 'package:lightmeter/res/theme.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class UserPreferencesProvider extends StatefulWidget { @@ -20,12 +21,8 @@ class UserPreferencesProvider extends StatefulWidget { return context.findAncestorStateOfType<_UserPreferencesProviderState>()!; } - static Brightness brightnessOf(BuildContext context) { - return _inheritFromEnumsModel(context, _ListenableAspect.brightness).brightness; - } - static DynamicColorState dynamicColorStateOf(BuildContext context) { - return _inheritFromEnumsModel(context, _ListenableAspect.dynamicColorState).dynamicColorState; + return _inheritFromThemeModel(context, _ThemeAspect.dynamicColorState).dynamicColorState; } static EvSourceType evSourceTypeOf(BuildContext context) { @@ -45,25 +42,26 @@ class UserPreferencesProvider extends StatefulWidget { .data[feature]!; } - static Color primaryColorOf(BuildContext context) { - return _inheritFromEnumsModel(context, _ListenableAspect.primaryColor).primaryColor; - } - static StopType stopTypeOf(BuildContext context) { return _inheritFromEnumsModel(context, _ListenableAspect.stopType).stopType; } - static ThemeType themeTypeOf(BuildContext context) { - return _inheritFromEnumsModel(context, _ListenableAspect.themeType).themeType; + static ThemeData themeOf(BuildContext context) { + return _inheritFromThemeModel(context, _ThemeAspect.theme).theme; } - static _EnumsModel _inheritFromEnumsModel( - BuildContext context, - _ListenableAspect aspect, - ) { + static ThemeType themeTypeOf(BuildContext context) { + return _inheritFromThemeModel(context, _ThemeAspect.themeType).themeType; + } + + static _EnumsModel _inheritFromEnumsModel(BuildContext context, _ListenableAspect aspect) { return InheritedModel.inheritFrom<_EnumsModel>(context, aspect: aspect)!; } + static _ThemeModel _inheritFromThemeModel(BuildContext context, _ThemeAspect aspect) { + return InheritedModel.inheritFrom<_ThemeModel>(context, aspect: aspect)!; + } + @override State createState() => _UserPreferencesProviderState(); } @@ -124,17 +122,19 @@ class _UserPreferencesProviderState extends State dynamicPrimaryColor = null; state = DynamicColorState.unavailable; } - return _EnumsModel( + return _ThemeModel( brightness: _themeBrightness, dynamicColorState: state, - evSourceType: evSourceType, - locale: locale, primaryColor: dynamicPrimaryColor ?? primaryColor, - stopType: stopType, themeType: themeType, - child: _MeteringScreenLayoutModel( - data: meteringScreenLayout, - child: widget.child, + child: _EnumsModel( + evSourceType: evSourceType, + locale: locale, + stopType: stopType, + child: _MeteringScreenLayoutModel( + data: meteringScreenLayout, + child: widget.child, + ), ), ); }, @@ -213,44 +213,28 @@ class _UserPreferencesProviderState extends State } enum _ListenableAspect { - brightness, - dynamicColorState, evSourceType, locale, - primaryColor, stopType, - themeType, } class _EnumsModel extends InheritedModel<_ListenableAspect> { - final Brightness brightness; - final DynamicColorState dynamicColorState; final EvSourceType evSourceType; final SupportedLocale locale; - final Color primaryColor; final StopType stopType; - final ThemeType themeType; const _EnumsModel({ - required this.brightness, - required this.dynamicColorState, required this.evSourceType, required this.locale, - required this.primaryColor, required this.stopType, - required this.themeType, required super.child, }); @override bool updateShouldNotify(_EnumsModel oldWidget) { - return brightness != oldWidget.brightness || - dynamicColorState != oldWidget.dynamicColorState || - evSourceType != oldWidget.evSourceType || + return evSourceType != oldWidget.evSourceType || locale != oldWidget.locale || - primaryColor != oldWidget.primaryColor || - stopType != oldWidget.stopType || - themeType != oldWidget.themeType; + stopType != oldWidget.stopType; } @override @@ -258,17 +242,55 @@ class _EnumsModel extends InheritedModel<_ListenableAspect> { _EnumsModel oldWidget, Set<_ListenableAspect> dependencies, ) { - return (brightness != oldWidget.brightness && - dependencies.contains(_ListenableAspect.brightness)) || - (dynamicColorState != oldWidget.dynamicColorState && - dependencies.contains(_ListenableAspect.dynamicColorState)) || - (evSourceType != oldWidget.evSourceType && + return (evSourceType != oldWidget.evSourceType && dependencies.contains(_ListenableAspect.evSourceType)) || (locale != oldWidget.locale && dependencies.contains(_ListenableAspect.locale)) || - (primaryColor != oldWidget.primaryColor && - dependencies.contains(_ListenableAspect.primaryColor)) || - (stopType != oldWidget.stopType && dependencies.contains(_ListenableAspect.stopType)) || - (themeType != oldWidget.themeType && dependencies.contains(_ListenableAspect.themeType)); + (stopType != oldWidget.stopType && dependencies.contains(_ListenableAspect.stopType)); + } +} + +enum _ThemeAspect { + dynamicColorState, + theme, + themeType, +} + +class _ThemeModel extends InheritedModel<_ThemeAspect> { + final DynamicColorState dynamicColorState; + final ThemeType themeType; + + final Brightness _brightness; + final Color _primaryColor; + + const _ThemeModel({ + required Brightness brightness, + required this.dynamicColorState, + required Color primaryColor, + required this.themeType, + required super.child, + }) : _brightness = brightness, + _primaryColor = primaryColor; + + ThemeData get theme => themeFrom(_primaryColor, _brightness); + + @override + bool updateShouldNotify(_ThemeModel oldWidget) { + return _brightness != oldWidget._brightness || + dynamicColorState != oldWidget.dynamicColorState || + _primaryColor != oldWidget._primaryColor || + themeType != oldWidget.themeType; + } + + @override + bool updateShouldNotifyDependent( + _ThemeModel oldWidget, + Set<_ThemeAspect> dependencies, + ) { + return (dependencies.contains(_ThemeAspect.theme) && + (_brightness != oldWidget._brightness || _primaryColor != oldWidget._primaryColor)) || + (dependencies.contains(_ThemeAspect.dynamicColorState) && + dynamicColorState != oldWidget.dynamicColorState) || + (dependencies.contains(_ThemeAspect.themeType) && themeType != oldWidget.themeType); } }