2025-01-31 10:24:37 +01:00

83 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
class ProgressBar extends StatelessWidget {
const ProgressBar(
{super.key,
required this.value,
this.backgroundColor,
this.height = 8.0});
final double value;
final Color? backgroundColor;
final double height;
@override
Widget build(BuildContext context) {
return Stack(
children: [
// Background
Container(
decoration: BoxDecoration(
color: Theme.of(context).brightness == Brightness.light
? Colors.black.withValues(alpha: 0.1)
: Colors.white.withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(45.0),
),
width: double.infinity,
height: height,
),
// Slider
AnimatedContainer(
duration: const Duration(milliseconds: 500),
width: double.infinity,
child: CustomPaint(
painter: ProgressPainter(
backgroundColor:
backgroundColor ?? Theme.of(context).colorScheme.secondary,
height: height,
value: value.clamp(0, 1),
),
),
)
],
);
}
}
class ProgressPainter extends CustomPainter {
ProgressPainter(
{required this.height,
required this.value,
required this.backgroundColor});
final double height;
final double value;
final Color backgroundColor;
@override
void paint(Canvas canvas, Size size) {
double width = size.width * value;
if (width <= 0) return;
// Slider
canvas.drawRRect(
RRect.fromRectAndRadius(
Rect.fromLTWH(0, 0, width, height),
const Radius.circular(45.0),
),
Paint()
..color = backgroundColor
..style = PaintingStyle.fill,
);
}
@override
bool shouldRepaint(ProgressPainter oldDelegate) {
return value != oldDelegate.value ||
height != oldDelegate.height ||
backgroundColor != oldDelegate.backgroundColor;
}
}