Separated _ThemeModel

This commit is contained in:
Vadim 2023-08-14 11:57:16 +02:00
parent fe4d1dfb58
commit 301814c6b2
2 changed files with 72 additions and 54 deletions

View file

@ -13,7 +13,6 @@ import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart';
import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/services_provider.dart';
import 'package:lightmeter/providers/user_preferences_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/metering/flow_metering.dart';
import 'package:lightmeter/screens/settings/flow_settings.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart';
import 'package:platform/platform.dart'; import 'package:platform/platform.dart';
@ -45,10 +44,7 @@ class Application extends StatelessWidget {
child: EquipmentProfileProvider( child: EquipmentProfileProvider(
child: Builder( child: Builder(
builder: (context) { builder: (context) {
final theme = themeFrom( final theme = UserPreferencesProvider.themeOf(context);
UserPreferencesProvider.primaryColorOf(context),
UserPreferencesProvider.brightnessOf(context),
);
final systemIconsBrightness = final systemIconsBrightness =
ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface); ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface);
return AnnotatedRegion( return AnnotatedRegion(

View file

@ -9,6 +9,7 @@ import 'package:lightmeter/data/models/theme_type.dart';
import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/services_provider.dart';
import 'package:lightmeter/res/theme.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
class UserPreferencesProvider extends StatefulWidget { class UserPreferencesProvider extends StatefulWidget {
@ -20,12 +21,8 @@ class UserPreferencesProvider extends StatefulWidget {
return context.findAncestorStateOfType<_UserPreferencesProviderState>()!; return context.findAncestorStateOfType<_UserPreferencesProviderState>()!;
} }
static Brightness brightnessOf(BuildContext context) {
return _inheritFromEnumsModel(context, _ListenableAspect.brightness).brightness;
}
static DynamicColorState dynamicColorStateOf(BuildContext context) { static DynamicColorState dynamicColorStateOf(BuildContext context) {
return _inheritFromEnumsModel(context, _ListenableAspect.dynamicColorState).dynamicColorState; return _inheritFromThemeModel(context, _ThemeAspect.dynamicColorState).dynamicColorState;
} }
static EvSourceType evSourceTypeOf(BuildContext context) { static EvSourceType evSourceTypeOf(BuildContext context) {
@ -45,25 +42,26 @@ class UserPreferencesProvider extends StatefulWidget {
.data[feature]!; .data[feature]!;
} }
static Color primaryColorOf(BuildContext context) {
return _inheritFromEnumsModel(context, _ListenableAspect.primaryColor).primaryColor;
}
static StopType stopTypeOf(BuildContext context) { static StopType stopTypeOf(BuildContext context) {
return _inheritFromEnumsModel(context, _ListenableAspect.stopType).stopType; return _inheritFromEnumsModel(context, _ListenableAspect.stopType).stopType;
} }
static ThemeType themeTypeOf(BuildContext context) { static ThemeData themeOf(BuildContext context) {
return _inheritFromEnumsModel(context, _ListenableAspect.themeType).themeType; return _inheritFromThemeModel(context, _ThemeAspect.theme).theme;
} }
static _EnumsModel _inheritFromEnumsModel( static ThemeType themeTypeOf(BuildContext context) {
BuildContext context, return _inheritFromThemeModel(context, _ThemeAspect.themeType).themeType;
_ListenableAspect aspect, }
) {
static _EnumsModel _inheritFromEnumsModel(BuildContext context, _ListenableAspect aspect) {
return InheritedModel.inheritFrom<_EnumsModel>(context, aspect: aspect)!; return InheritedModel.inheritFrom<_EnumsModel>(context, aspect: aspect)!;
} }
static _ThemeModel _inheritFromThemeModel(BuildContext context, _ThemeAspect aspect) {
return InheritedModel.inheritFrom<_ThemeModel>(context, aspect: aspect)!;
}
@override @override
State<UserPreferencesProvider> createState() => _UserPreferencesProviderState(); State<UserPreferencesProvider> createState() => _UserPreferencesProviderState();
} }
@ -124,18 +122,20 @@ class _UserPreferencesProviderState extends State<UserPreferencesProvider>
dynamicPrimaryColor = null; dynamicPrimaryColor = null;
state = DynamicColorState.unavailable; state = DynamicColorState.unavailable;
} }
return _EnumsModel( return _ThemeModel(
brightness: _themeBrightness, brightness: _themeBrightness,
dynamicColorState: state, dynamicColorState: state,
primaryColor: dynamicPrimaryColor ?? primaryColor,
themeType: themeType,
child: _EnumsModel(
evSourceType: evSourceType, evSourceType: evSourceType,
locale: locale, locale: locale,
primaryColor: dynamicPrimaryColor ?? primaryColor,
stopType: stopType, stopType: stopType,
themeType: themeType,
child: _MeteringScreenLayoutModel( child: _MeteringScreenLayoutModel(
data: meteringScreenLayout, data: meteringScreenLayout,
child: widget.child, child: widget.child,
), ),
),
); );
}, },
); );
@ -213,44 +213,28 @@ class _UserPreferencesProviderState extends State<UserPreferencesProvider>
} }
enum _ListenableAspect { enum _ListenableAspect {
brightness,
dynamicColorState,
evSourceType, evSourceType,
locale, locale,
primaryColor,
stopType, stopType,
themeType,
} }
class _EnumsModel extends InheritedModel<_ListenableAspect> { class _EnumsModel extends InheritedModel<_ListenableAspect> {
final Brightness brightness;
final DynamicColorState dynamicColorState;
final EvSourceType evSourceType; final EvSourceType evSourceType;
final SupportedLocale locale; final SupportedLocale locale;
final Color primaryColor;
final StopType stopType; final StopType stopType;
final ThemeType themeType;
const _EnumsModel({ const _EnumsModel({
required this.brightness,
required this.dynamicColorState,
required this.evSourceType, required this.evSourceType,
required this.locale, required this.locale,
required this.primaryColor,
required this.stopType, required this.stopType,
required this.themeType,
required super.child, required super.child,
}); });
@override @override
bool updateShouldNotify(_EnumsModel oldWidget) { bool updateShouldNotify(_EnumsModel oldWidget) {
return brightness != oldWidget.brightness || return evSourceType != oldWidget.evSourceType ||
dynamicColorState != oldWidget.dynamicColorState ||
evSourceType != oldWidget.evSourceType ||
locale != oldWidget.locale || locale != oldWidget.locale ||
primaryColor != oldWidget.primaryColor || stopType != oldWidget.stopType;
stopType != oldWidget.stopType ||
themeType != oldWidget.themeType;
} }
@override @override
@ -258,17 +242,55 @@ class _EnumsModel extends InheritedModel<_ListenableAspect> {
_EnumsModel oldWidget, _EnumsModel oldWidget,
Set<_ListenableAspect> dependencies, Set<_ListenableAspect> dependencies,
) { ) {
return (brightness != oldWidget.brightness && return (evSourceType != oldWidget.evSourceType &&
dependencies.contains(_ListenableAspect.brightness)) ||
(dynamicColorState != oldWidget.dynamicColorState &&
dependencies.contains(_ListenableAspect.dynamicColorState)) ||
(evSourceType != oldWidget.evSourceType &&
dependencies.contains(_ListenableAspect.evSourceType)) || dependencies.contains(_ListenableAspect.evSourceType)) ||
(locale != oldWidget.locale && dependencies.contains(_ListenableAspect.locale)) || (locale != oldWidget.locale && dependencies.contains(_ListenableAspect.locale)) ||
(primaryColor != oldWidget.primaryColor && (stopType != oldWidget.stopType && dependencies.contains(_ListenableAspect.stopType));
dependencies.contains(_ListenableAspect.primaryColor)) || }
(stopType != oldWidget.stopType && dependencies.contains(_ListenableAspect.stopType)) || }
(themeType != oldWidget.themeType && dependencies.contains(_ListenableAspect.themeType));
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);
} }
} }