render method
Renders the widget onto the provided buffer within the specified area.
Implementation
@override
void render(Buffer buffer, Rect area) {
if (area.width <= 0 || area.height <= 0) return;
final minutes = duration.inMinutes;
final seconds = duration.inSeconds % 60;
final mm = minutes.toString().padLeft(2, '0');
final ss = seconds.toString().padLeft(2, '0');
final timeStringLength = 5; // "MM:SS"
final startX = ((area.width - timeStringLength) / 2).floor().clamp(
0,
area.width,
);
// Draw digits & separators
if (startX + 5 <= area.width) {
buffer.writeString(startX, 0, mm, digitStyle);
buffer.writeString(startX + 2, 0, ':', separatorStyle);
buffer.writeString(startX + 3, 0, ss, digitStyle);
} else {
// Fallback: draw what fits
final fallback = '$mm:$ss'.substring(0, area.width);
buffer.writeString(0, 0, fallback, digitStyle);
}
if (area.height >= 2) {
// Draw progress bar below
final progress = initialDuration.inMilliseconds == 0
? 0.0
: duration.inMilliseconds / initialDuration.inMilliseconds;
final progressWidth = area.width;
final filledCount = (progress * progressWidth).round().clamp(
0,
progressWidth,
);
final barText = '█' * filledCount + '░' * (progressWidth - filledCount);
buffer.writeString(0, 1, barText, progressStyle);
}
}