extractValue static method

dynamic extractValue(
  1. String reference,
  2. Map dataMap,
  3. Type T
)

Implementation

static extractValue(String reference, Map dataMap, Type T) {
  dynamic defaultValue = _getDefaultValue(reference, T);
  dynamic value = dataMap[reference];

  if (value is String) {
    String valueCasted = value;
    if (LocalStringUtils.isNullOrEmpty(valueCasted,
        considerWhiteSpaceAsEmpty: true)) return defaultValue;

    switch (T) {
      case DateTime:
        try {
          return DateFormat(_dateFormat).parse(valueCasted, true);
        } catch (err) {
          return defaultValue;
        }
      case String:
        return valueCasted;

      case Color:
      case int:

        // Color hexadecimal representation
        final RegExpMatch? match =
            RegExp(r'^(0x|#)(\w{2})?(\w{6,6})$').firstMatch(valueCasted);

        if (match != null) {
          String hex = (match.group(2) ?? 'FF') + match.group(3)!;
          final int colorValue = int.parse(hex, radix: 16);
          return (T == Color) ? Color(colorValue) : colorValue;
        } else if (T == int) {
          int? parsedValue = int.tryParse(valueCasted.replaceFirstMapped(
              RegExp(r'^(\d+)\.\d+$'), (match) => '${match.group(1)}'));
          return parsedValue ?? defaultValue;
        }
        break;

      case double:
        double? parsedValue = double.tryParse(valueCasted);
        return parsedValue ?? defaultValue;

      case bool:
        return valueCasted.toLowerCase() == 'true';
    }
  }

  switch (T) {
    case int:
      if (value is int) return value;
      if (value is double) return value.round();
      return defaultValue;

    case double:
      if (value is int) return value;
      if (value is double) return value;
      return defaultValue;

    case Color:
      switch (value.runtimeType) {
        case MaterialColor:
          value = (value as MaterialColor).shade500;
          break;

        case MaterialAccentColor:
          value = Color((value as MaterialAccentColor).value);
          break;

        case CupertinoDynamicColor:
          value = Color((value as CupertinoDynamicColor).value);
          break;
      }
      break;

    case bool:
      return value ?? defaultValue ?? false;
  }

  if (value.runtimeType.hashCode != T.hashCode) return defaultValue;

  return defaultValue;
}