decodeWidgetStateColor static method

WidgetStateColor? decodeWidgetStateColor(
  1. dynamic value, {
  2. bool validate = true,
})

Decodes a value into a WidgetStateColor. If the value is a String then the value will be used for all states.

Alternatively, if the value is a Map then this expects the following format:

{
  "disabled": "<Color>",
  "dragged": "<Color>",
  "empty": "<Color>",
  "error": "<Color>",
  "focused": "<Color>",
  "hovered": "<Color>",
  "pressed": "<Color>",
  "scrolledUnder": "<Color>",
  "selected": "<Color>"
}

The "empty" will be used for when any other value is missing.

Implementation

static WidgetStateColor? decodeWidgetStateColor(
  dynamic value, {
  bool validate = true,
}) {
  WidgetStateColor? result;

  if (value is WidgetStateColor) {
    result = value;
  } else if (value is Color) {
    result = WidgetStateColor.resolveWith((_) => value);
  } else if (value != null) {
    assert(SchemaValidator.validate(
      schemaId: '$_baseSchemaUrl/widget_state_color',
      value: value,
      validate: validate,
    ));

    result = WidgetStateColor.resolveWith((states) {
      Color? result;

      if (value is String) {
        result = decodeColor(value, validate: false);
      } else if (value is Color) {
        result = value;
      } else if (states.contains(WidgetState.disabled)) {
        result = decodeColor(
          value['disabled'],
          validate: false,
        );
      } else if (states.contains(WidgetState.dragged)) {
        result = decodeColor(
          value['dragged'],
          validate: false,
        );
      } else if (states.contains(WidgetState.error)) {
        result = decodeColor(
          value['error'],
          validate: false,
        );
      } else if (states.contains(WidgetState.focused)) {
        result = decodeColor(
          value['focused'],
          validate: false,
        );
      } else if (states.contains(WidgetState.hovered)) {
        result = decodeColor(
          value['hovered'],
          validate: false,
        );
      } else if (states.contains(WidgetState.pressed)) {
        result = decodeColor(
          value['pressed'],
          validate: false,
        );
      } else if (states.contains(WidgetState.scrolledUnder)) {
        result = decodeColor(
          value['scrolledUnder'],
          validate: false,
        );
      } else if (states.contains(WidgetState.selected)) {
        result = decodeColor(
          value['selected'],
          validate: false,
        );
      }

      result ??= decodeColor(
        value['empty'],
        validate: false,
      );

      if (result == null) {
        throw Exception(
          'Unable to decode required Color for WidgetStateColor for state: $states and no "empty" value exists.',
        );
      }

      return result;
    });
  }
  return result;
}