decodeGradient static method

Gradient? decodeGradient(
  1. dynamic value, {
  2. bool validate = true,
})

Decodes the given value into a Gradient. If the value is null then null will be returned.

When the value is not null, this expects a type attribute of one of the following values:

  • linear
  • radial
  • sweep

The expected JSON will depend on the specified type and are each described below:

Type: linear

{
  "begin": "<Alignment>",
  "colors": "<Color[]>",
  "end": "<Alignment>",
  "stops": "<double[]>",
  "tileMode": "<TileMode>",
  "transform": "<GradientTransform>",
  "type": "linear"
}

Type: radial

{
  "center": "<Alignment>",
  "colors": "<Color[]>",
  "focal": "<Alignment>",
  "focalRadius": "<double>",
  "radius": "<double>",
  "stops": "<double[]>",
  "tileMode": "<TileMode>",
  "transform": "<GradientTransform>",
  "type": "radial"
}

Type: sweep

{
  "center": "<Alignment>",
  "colors": "<Color[]>",
  "endAngle": "<double>",
  "startAngle": "<double>",
  "stops": "<double[]>",
  "tileMode": "<TileMode>",
  "transform": "<GradientTransform>",
  "type": "sweep"
}

See also:

Implementation

static Gradient? decodeGradient(
  dynamic value, {
  bool validate = true,
}) {
  Gradient? result;
  if (value is Gradient) {
    result = value;
  } else {
    assert(value == null || value['type'] is String);
    _checkSupported(
      'Gradient',
      [
        'linear',
        'radial',
        'sweep',
      ],
      value == null ? null : value['type'],
    );

    if (value != null) {
      assert(SchemaValidator.validate(
        schemaId: '$_baseSchemaUrl/gradient',
        value: value,
        validate: validate,
      ));
      final type = value['type'];

      switch (type) {
        case 'linear':
          result = LinearGradient(
            begin: decodeAlignment(
                  value['begin'],
                  validate: false,
                ) ??
                Alignment.centerLeft,
            colors: _decodeStringList<Color>(
              value['colors'],
              (value) {
                final color = decodeColor(
                  value,
                  validate: false,
                );

                return color!;
              },
            )!,
            end: decodeAlignment(
                  value['end'],
                  validate: false,
                ) ??
                Alignment.centerRight,
            stops: _decodeDynamicList<double>(
              value['stops'],
              (value) => JsonClass.maybeParseDouble(value)!,
            ),
            tileMode: decodeTileMode(
                  value['tileMode'],
                  validate: false,
                ) ??
                TileMode.clamp,
            transform: decodeGradientTransform(
              value['transform'],
              validate: false,
            ),
          );
          break;
        case 'radial':
          result = RadialGradient(
            center: decodeAlignment(
                  value['center'],
                  validate: false,
                ) ??
                Alignment.center,
            colors: _decodeStringList<Color>(
              value['colors'],
              (value) => decodeColor(
                value,
                validate: false,
              )!,
            )!,
            focal: decodeAlignment(
              value['focal'],
              validate: false,
            ),
            focalRadius:
                JsonClass.maybeParseDouble(value['focalRadius'], 0.0)!,
            radius: JsonClass.maybeParseDouble(value['radius'], 0.5)!,
            stops: _decodeDynamicList<double>(
              value['stops'],
              (value) => JsonClass.maybeParseDouble(value)!,
            ),
            tileMode: decodeTileMode(
                  value['tileMode'],
                  validate: false,
                ) ??
                TileMode.clamp,
            transform: decodeGradientTransform(
              value['transform'],
              validate: false,
            ),
          );
          break;
        case 'sweep':
          result = SweepGradient(
            center: decodeAlignment(
                  value['center'],
                  validate: false,
                ) ??
                Alignment.center,
            colors: _decodeStringList<Color>(
              value['colors'],
              (value) => decodeColor(
                value,
                validate: false,
              )!,
            )!,
            endAngle: JsonClass.maybeParseDouble(
              value['endAngle'],
              math.pi * 2,
            )!,
            startAngle: JsonClass.maybeParseDouble(
              value['startAngle'],
              0.0,
            )!,
            stops: _decodeDynamicList<double>(
              value['stops'],
              (value) => JsonClass.maybeParseDouble(value)!,
            ),
            tileMode: decodeTileMode(
                  value['tileMode'],
                  validate: false,
                ) ??
                TileMode.clamp,
            transform: decodeGradientTransform(
              value['transform'],
              validate: false,
            ),
          );
          break;
      }
    }
  }

  return result;
}