feat(ui_kit-ui_components): Modify the theme resolver to utilize the theme helper and streamline the logic

This commit is contained in:
Malo Léon 2023-02-23 10:24:54 +01:00
parent 970dde2ef1
commit 0c176ba0fa
11 changed files with 63 additions and 79 deletions

View File

@ -15,6 +15,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_ui_components/src/core/utils/theme_helper.dart';
import 'package:wyatt_ui_components/src/domain/entities/theme_style.dart';
/// {@template theme_resolver}
@ -38,52 +39,35 @@ abstract class ThemeResolver<S extends ThemeStyle<S>, T, E> {
S? Function(BuildContext context, {E? extra}) get customStyleFn;
/// Compute default value from Flutter Theme or with hardcoded values.
S computeDefaultValue(BuildContext context, {E? extra});
S? computeExtensionValueFn(
BuildContext context,
T themeExtension, {
S computeDefaultValue(
BuildContext context, {
E? extra,
});
/// Compute values from the extension if found
S? _computeExtensionValue(
BuildContext context, {
/// Compute extension value from custom component extension.
S? computeExtensionValueFn(
BuildContext context,
T? themeExtension, {
E? extra,
}) {
final themeExtension = Theme.of(context).extension<T>();
if (themeExtension != null) {
return computeExtensionValueFn(
context,
themeExtension,
extra: extra,
);
}
return null;
}
/// Compute custom value
S? _computeCustomValue(
BuildContext context, {
E? extra,
}) {
final customStyle = customStyleFn(
context,
extra: extra,
);
if (customStyle != null) {
return customStyle;
}
return null;
}
});
/// Choose most suitable style for a given context.
S negotiate(BuildContext context, {E? extra}) {
S style = computeDefaultValue(context, extra: extra);
style =
style.mergeWith(_computeExtensionValue(context, extra: extra)) ?? style;
style =
style.mergeWith(_computeCustomValue(context, extra: extra)) ?? style;
return style;
final style = computeDefaultValue(context, extra: extra);
return ThemeHelper.getThemeElement<S, S>(
[
style,
computeExtensionValueFn(
context,
Theme.of(context).extension<T>(),
extra: extra,
),
// _computeExtensionValue(context, extra: extra),
customStyleFn(context, extra: extra)
],
transform: (value) => value,
combine: (value, element) => value?.mergeWith(element),
) ??
style;
}
}

View File

@ -16,4 +16,5 @@
export 'multi_color.dart';
export 'text_wrapper.dart';
export 'theme_helper.dart';
export 'theme_resolver.dart';

View File

@ -80,33 +80,33 @@ class FileSelectionButtonThemeResolver extends ThemeResolver<
@override
FileSelectionButtonStyle? computeExtensionValueFn(
BuildContext context,
FileSelectionButtonThemeExtension themeExtension, {
FileSelectionButtonThemeExtension? themeExtension, {
ButtonState? extra,
}) {
FileSelectionButtonStyle? style;
switch (extra?.state) {
case ControlState.disabled:
style = themeExtension.disabledStyle;
style = themeExtension?.disabledStyle;
break;
case ControlState.focused:
style = themeExtension.focusedStyle;
style = themeExtension?.focusedStyle;
break;
case ControlState.hovered:
style = themeExtension.hoveredStyle;
style = themeExtension?.hoveredStyle;
break;
case ControlState.tapped:
style = themeExtension.tappedStyle;
style = themeExtension?.tappedStyle;
break;
case ControlState.normal:
case null:
style = themeExtension.normalStyle;
style = themeExtension?.normalStyle;
break;
}
if (extra?.isSelected ?? false) {
style = themeExtension.selectedStyle;
style = themeExtension?.selectedStyle;
}
if (extra?.isInvalid ?? false) {
style = themeExtension.invalidStyle;
style = themeExtension?.invalidStyle;
}
return style;
}

View File

@ -76,21 +76,21 @@ class FlatButtonThemeResolver extends ThemeResolver<FlatButtonStyle,
@override
FlatButtonStyle? computeExtensionValueFn(
BuildContext context,
FlatButtonThemeExtension themeExtension, {
FlatButtonThemeExtension? themeExtension, {
ControlState? extra,
}) {
switch (extra) {
case ControlState.disabled:
return themeExtension.disabledStyle;
return themeExtension?.disabledStyle;
case ControlState.focused:
return themeExtension.focusedStyle;
return themeExtension?.focusedStyle;
case ControlState.hovered:
return themeExtension.hoveredStyle;
return themeExtension?.hoveredStyle;
case ControlState.tapped:
return themeExtension.tappedStyle;
return themeExtension?.tappedStyle;
case ControlState.normal:
case null:
return themeExtension.normalStyle;
return themeExtension?.normalStyle;
}
}
}

View File

@ -74,21 +74,21 @@ class SimpleIconButtonThemeResolver extends ThemeResolver<SimpleIconButtonStyle,
@override
SimpleIconButtonStyle? computeExtensionValueFn(
BuildContext context,
SimpleIconButtonThemeExtension themeExtension, {
SimpleIconButtonThemeExtension? themeExtension, {
ControlState? extra,
}) {
switch (extra) {
case ControlState.disabled:
return themeExtension.disabledStyle;
return themeExtension?.disabledStyle;
case ControlState.focused:
return themeExtension.focusedStyle;
return themeExtension?.focusedStyle;
case ControlState.hovered:
return themeExtension.hoveredStyle;
return themeExtension?.hoveredStyle;
case ControlState.tapped:
return themeExtension.tappedStyle;
return themeExtension?.tappedStyle;
case ControlState.normal:
case null:
return themeExtension.normalStyle;
return themeExtension?.normalStyle;
}
}
}

View File

@ -76,30 +76,30 @@ class SymbolButtonThemeResolver extends ThemeResolver<SymbolButtonStyle,
@override
SymbolButtonStyle? computeExtensionValueFn(
BuildContext context,
SymbolButtonThemeExtension themeExtension, {
SymbolButtonThemeExtension? themeExtension, {
ButtonState? extra,
}) {
SymbolButtonStyle? style;
switch (extra?.state) {
case ControlState.disabled:
style = themeExtension.disabledStyle;
style = themeExtension?.disabledStyle;
break;
case ControlState.focused:
style = themeExtension.focusedStyle;
style = themeExtension?.focusedStyle;
break;
case ControlState.hovered:
style = themeExtension.hoveredStyle;
style = themeExtension?.hoveredStyle;
break;
case ControlState.tapped:
style = themeExtension.tappedStyle;
style = themeExtension?.tappedStyle;
break;
case ControlState.normal:
case null:
style = themeExtension.normalStyle;
style = themeExtension?.normalStyle;
break;
}
if (extra?.isSelected ?? false) {
style = themeExtension.selectedStyle;
style = themeExtension?.selectedStyle;
}
return style;

View File

@ -48,11 +48,11 @@ class LoaderThemeResolver
@override
LoaderStyle? computeExtensionValueFn(
BuildContext context,
LoaderThemeExtension themeExtension, {
LoaderThemeExtension? themeExtension, {
void extra,
}) =>
LoaderStyle(
colors: themeExtension.colors,
stroke: themeExtension.stroke,
colors: themeExtension?.colors,
stroke: themeExtension?.stroke,
);
}

View File

@ -43,11 +43,11 @@ class RichTextBuilderThemeResolver extends ThemeResolver<RichTextBuilderStyle,
@override
RichTextBuilderStyle? computeExtensionValueFn(
BuildContext context,
RichTextBuilderThemeExtension themeExtension, {
RichTextBuilderThemeExtension? themeExtension, {
void extra,
}) =>
RichTextBuilderStyle(
defaultStyle: themeExtension.defaultStyle,
styles: themeExtension.styles,
defaultStyle: themeExtension?.defaultStyle,
styles: themeExtension?.styles,
);
}

View File

@ -118,19 +118,19 @@ class TextInputThemeResolver extends ThemeResolver<TextInputStyle,
@override
TextInputStyle? computeExtensionValueFn(
BuildContext context,
TextInputThemeExtension themeExtension, {
TextInputThemeExtension? themeExtension, {
TextInputState? extra,
}) {
TextInputStyle? textInputStyle;
switch (extra?.controlState) {
case ControlState.focused:
textInputStyle = themeExtension.focusedStyle;
textInputStyle = themeExtension?.focusedStyle;
break;
case ControlState.disabled:
textInputStyle = themeExtension.disableStyle;
textInputStyle = themeExtension?.disableStyle;
break;
case ControlState.normal:
textInputStyle = themeExtension.normalStyle;
textInputStyle = themeExtension?.normalStyle;
break;
case ControlState.hovered:
case ControlState.tapped:
@ -141,7 +141,7 @@ class TextInputThemeResolver extends ThemeResolver<TextInputStyle,
TextInputStyle? style;
switch (extra?.statusState) {
case StatusState.error:
style = themeExtension.errorStyle;
style = themeExtension?.errorStyle;
break;
case StatusState.initial:
case StatusState.success:

View File

@ -15,4 +15,3 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
export './linear_gradient_helper.dart';
export './theme_helper.dart';