setArcDash function Null safety

void setArcDash(
  1. Canvas canvas,
  2. double centerX,
  3. double centerY,
  4. double radiusX,
  5. double radiusY,
  6. Paint paint,
  7. double beginAngle,
  8. double endAngle,
  9. List<double> segments,
  10. [bool useCenter = false]
)

Implementation

void setArcDash(
    Canvas canvas,
    double centerX,
    double centerY,
    double radiusX,
    double radiusY,
    Paint paint,
    double beginAngle,
    double endAngle,
    List<double> segments,
    [bool useCenter = false]) {
  /*
      when array has even length
      [5, 15] => [0, 15]
      when array has odd length
      [5, 15, 16] => [5, 15, 16, 5, 15, 16]
     */
  final _segments =
      segments.length % 2 == 0 ? segments : [...segments, ...segments];
  final generator = _GenOnDemand(_segments);

  final trueCenterX = centerX - radiusX / 2;
  final trueCenterY = centerY - radiusY / 2;
  double _curAngle = beginAngle;
  double _lastAngle = beginAngle;
  double _sweepAmount = 0;
  int i = 0;

  do {
    // Draw arc line every other iteration;
    if (i % 2 != 0) {
      double cur = _curAngle * (pi / 180);
      double sweep = _sweepAmount * (pi / 180);
      canvas.drawArc(Offset(trueCenterX, trueCenterY) & Size(radiusX, radiusY),
          cur, sweep, useCenter, paint);
    }

    i++;
    _lastAngle = _curAngle;
    _curAngle += generator.next();
    _sweepAmount = (_curAngle - _lastAngle.abs());
  } while (_curAngle + _sweepAmount < endAngle);
}