updateSegmentGradient method
Implementation
@nonVirtual
void updateSegmentGradient(ChartSegment segment) {
final int segmentIndex = segment.currentSegmentIndex;
// This method is called by the data source setter before updating the
// segments, when the data source is updated dynamically. As a result,
// the length of the data source is updated while the length of the
// segments is not updated, which can lead to a range error exception.
// To prevent this, a condition has been added to ensure the segmentIndex
// is less than the data source length.
if (!segment.isEmpty &&
dataSource != null &&
segmentIndex < dataSource!.length) {
if (pointShaderMapper != null) {
final Shader shader = pointShaderMapper!(
dataSource![segmentIndex],
segmentIndex,
palette[segmentIndex % palette.length],
Rect.fromCircle(center: center, radius: currentRadius));
segment.fillPaint.shader = shader;
} else if (onCreateShader != null) {
final ChartShaderDetails details = createShaderDetails();
segment.fillPaint.shader = onCreateShader!(details);
} else if (pointRenderMode == PointRenderMode.gradient) {
final List<Color> colors = List<Color>.generate(
segments.length, (int i) => palette[i % palette.length]);
final List<double> stops = <double>[];
num initialStops = 0;
for (int i = 0; i < segments.length; i++) {
final double segmentRatio = circularYValues[i] / sumOfY;
if (stops.isEmpty) {
initialStops = segmentRatio / 4;
stops.add(segmentRatio - initialStops);
} else {
if (stops.length == 1) {
stops.add((segmentRatio + stops.last) + initialStops / 1.5);
} else {
stops.add(segmentRatio + stops.last);
}
}
}
final SweepGradient sweep = SweepGradient(
startAngle: degreeToRadian(startAngle),
endAngle: degreeToRadian(endAngle),
colors: colors,
stops: stops,
transform: GradientRotation(degreeToRadian(-90)));
segment.fillPaint.shader = sweep.createShader(
createShaderDetails().outerRect,
textDirection: TextDirection.ltr);
}
}
}