mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2025-05-20 07:00:41 +00:00
Separated _ThemeModel
This commit is contained in:
parent
fe4d1dfb58
commit
301814c6b2
2 changed files with 72 additions and 54 deletions
|
@ -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(
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue