出于某种原因,我的 CustomPainter 没有在屏幕上绘制任何内容。我正在尝试构建一个饼图,但画家仅在我将 sweepAngle 设置为 2*pi 时才起作用。
调用 CustomPaint 的 Widget 结构如下:
class PieChart extends StatelessWidget {
const PieChart({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
height: 160,
width: 210,
child: CustomPaint(
painter: PieChartPainter(categories: dataset, width: 10),
),
);
}
}
这是我的 CustomPainter 类:
class PieChartPainter extends CustomPainter {
PieChartPainter({
required this.categories,
required this.width,
});
final List<Category> categories;
final double width;
@override
void paint(Canvas canvas, Size size) {
Offset center = Offset(size.width / 2, size.height / 2);
double radius = min(size.width / 2, size.height / 2);
double total = 0;
// Calculate total amount from each category
for (var expense in categories) {
total += expense.amount;
}
// The angle/radian at 12 o'clock
double startRadian = -pi / 2;
for (var index = 0; index < categories.length; index++) {
final currentCategory = categories.elementAt(index);
final sweepRadian = currentCategory.amount / total * 2 * pi;
final paint = Paint()
..style = PaintingStyle.fill
..strokeWidth = width
..color = categoryColors.elementAt(index % categories.length);
final rect = Rect.fromCenter(
center: center, width: radius * 2, height: radius * 2);
canvas.drawArc(
rect,
startRadian,
2 * pi, // should really be "sweepRadian"
false,
paint,
);
startRadian += sweepRadian;
}
}
@override
bool shouldRepaint(PieChartPainter oldDelegate) {
return true;
}
}
我几乎可以肯定地说这个问题与我提供的数据和颜色无关,因为每当我将当前元素记录到控制台时,它都会给出正确的输出。在这里,您可以看到我的 Widget 结构:
这是组件本身的图像:(请注意,整个圆圈只显示最后一个类别颜色,因为每当我使用小于 2*pi 的 sweepAngle 时,整个小部件都不会显示颜色。)
我真的无法弄清楚可能导致此问题的原因。有没有人知道sweepAngle参数还会影响什么?我也不知道为什么各个类别左侧的彩色圆圈不可见,因为它们呈现在一个完全不同的小部件分支中......如果你对如何解决这个问题有任何想法,我会更多很乐意提供更多信息,但只要我不知道去哪里看,我不想用不必要的信息向这个问题发送垃圾邮件。