decodeSeries<T, D> static method

Series<T, D> decodeSeries<T, D>(
  1. dynamic map, {
  2. bool validate = true,
})

Decodes the object from a Map-like dynamic structure. This expects the JSON format to be of the following structure:

{
  "areaColorFn": <TypedAccessorFn<T, Color>>,
  "colorFn": <TypedAccessorFn<T, Color>>,
  "dashPatternFn": <TypedAccessorFn<T, List<int>>>,
  "data": <List<T>>,
  "displayName": <String>,
  "domainFormatterFn": <TypedAccessorFn<T, DomainFormatter<D>>>,
  "domainLowerBoundFn": <TypedAccessorFn<T, D>>,
  "domainUpperBoundFn": <TypedAccessorFn<T, D>>,
  "domainFn": <TypedAccessorFn<T, D>>,
  "fillColorFn": <TypedAccessorFn<T, Color>>,
  "fillPatternFn": <TypedAccessorFn<T, Color>>,
  "id": <String>,
  "insideLabelStyleAccessorFn": <TypedAccessorFn<T, TextStyleSpec>>,
  "keyFn": <TypedAccessorFn<T, String>>,
  "labelAccessorFn": <TypedAccessorFn<T, String>>,
  "measureFn": map['measureFn'],
  "measureFormatterFn": <TypedAccessorFn<T, MeasureFormatter>>,
  "measureLowerBoundFn": <TypedAccessorFn<T, num>>,
  "measureOffsetFn": <TypedAccessorFn<T, num>>,
  "measureUpperBoundFn": <TypedAccessorFn<T, num>>,
  "outsideLabelStyleAccessorFn": <TypedAccessorFn<T, TextStyleSpec>>,
  "overlaySeries": <bool>,
  "patternColorFn": <TypedAccessorFn<T, Color>>,
  "radiusPxFn": <TypedAccessorFn<T, num>>,
  "seriesCategory": <String>,
  "seriesColor": <Color>,
  "strokeWidthPxFn": <TypedAccessorFn<T, num>>
}

See also

Implementation

static charts.Series<T, D> decodeSeries<T, D>(
  dynamic map, {
  bool validate = true,
}) {
  charts.Series<T, D>? result;

  try {
    if (map is charts.Series<T, D>) {
      result = map;
    } else if (map is charts.Series<T, T>) {
      throw Exception(
        '[decodeSeries]: Expected a series of [charts.Series<${T.toString()}, ${D.toString()}>}] but received a series of [charts.Series<${T.toString()}, ${T.toString()}>}].',
      );
    } else if (map is charts.Series<D, D>) {
      throw Exception(
        '[decodeSeries]: Expected a series of [charts.Series<${T.runtimeType}, ${D.runtimeType}>}] but received a series of [charts.Series<${D.runtimeType}, ${D.runtimeType}>}].',
      );
    } else if (map == null) {
      throw Exception('[decodeSeries]: map is null');
    } else if (map is String) {
      throw Exception(
        '[decodeSeries]: Invalid series, encountered a String.\n$map',
      );
    } else {
      assert(SchemaValidator.validate(
        schemaId: '$_baseSchemaUrl/series',
        value: map,
        validate: validate,
      ));
      result = charts.Series<T, D>(
        areaColorFn: map['areaColorFn'],
        colorFn: map['colorFn'],
        dashPatternFn: map['dashPatternFn'],
        data: JsonClass.parseJson(map['data']),
        displayName: map['displayName']?.toString(),
        domainFormatterFn: map['domainFormatterFn'],
        domainLowerBoundFn: map['domainLowerBoundFn'],
        domainUpperBoundFn: map['domainUpperBoundFn'],
        domainFn: map['domainFn'],
        fillColorFn: map['fillColorFn'],
        fillPatternFn: map['fillPatternFn'],
        id: map['id'].toString(),
        insideLabelStyleAccessorFn: map['insideLabelStyleAccessorFn'],
        keyFn: map['keyFn'],
        labelAccessorFn: map['labelAccessorFn'],
        measureFn: map['measureFn'],
        measureFormatterFn: map['measureFormatterFn'],
        measureLowerBoundFn: map['measureLowerBoundFn'],
        measureOffsetFn: map['measureOffsetFn'],
        measureUpperBoundFn: map['measureUpperBoundFn'],
        outsideLabelStyleAccessorFn: map['outsideLabelStyleAccessorFn'],
        overlaySeries: JsonClass.parseBool(map['overlaySeries']),
        patternColorFn: map['patternColorFn'],
        radiusPxFn: map['radiusPxFn'],
        seriesCategory: map['seriesCategory']?.toString(),
        seriesColor: decodeColor(
          map['seriesColor'],
          validate: false,
        ),
        strokeWidthPxFn: map['strokeWidthPxFn'],
      );
    }
  } catch (e, stack) {
    _logger.severe('Error decoding series: $map', e, stack);
    rethrow;
  }

  return result;
}