build method

  1. @override
void build()
override

Declares this node's children and behavior.

Runs once on mount, and again on every rebuild.

super.build() is required, as skipping it drops whatever the superclass declared.

Implementation

@override
void build() {
  super.build();

  tick((dt) {
    if (_finished) return;
    final amount = dt * speed;
    if (amount <= 0 || !amount.isFinite) return;

    _elapsed += amount;

    // Every pass re-reads the fields, so a handler calling play() redirects
    // this loop instead of racing it.
    while (true) {
      final duration = _sprite.duration(_row, _frame);

      if (duration <= 0 || !duration.isFinite) {
        _elapsed = 0;
        return;
      }

      if (_elapsed < duration) return;
      _elapsed -= duration;
      final next = _frame + 1;

      if (next < _sprite.frames(_row)) {
        _frame = next;
        _source = null;
        onFrame.emit(next);
      } else if (loops) {
        _frame = 0;
        _source = null;
        onFrame.emit(0);
        onLoop.emit();
      } else {
        _elapsed = 0;
        _finished = true;
        onFinish.emit();

        if (cleanup) {
          detach();
        }

        return;
      }
    }
  });

  void painter(Canvas canvas, Paint paint) {
    canvas.drawImageRect(
      _sprite.image(_row),
      _source ??= _sprite.rect(_row, _frame),
      _destination ??= .fromLTWH(0, 0, width, height),
      paint,
    );
  }

  draw((canvas) {
    palette.draw(canvas, painter);
  });

  debugDraw((canvas) {
    canvas.drawRect(.fromLTWH(0, 0, width, height), DEBUG_TRANSFORM_PAINT);
  });
}