0

出于某种原因,我的 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 结构: 在这里,你可以看到我的 Widget 结构

这是组件本身的图像:(请注意,整个圆圈只显示最后一个类别颜色,因为每当我使用小于 2*pi 的 sweepAngle 时,整个小部件都不会显示颜色。) 组件本身

这是我设置的扫描角度小于 2*pi 时的组件: sweepAngle 小于 2*pi 的组件

我真的无法弄清楚可能导致此问题的原因。有没有人知道sweepAngle参数还会影响什么?我也不知道为什么各个类别左侧的彩色圆圈不可见,因为它们呈现在一个完全不同的小部件分支中......如果你对如何解决这个问题有任何想法,我会更多很乐意提供更多信息,但只要我不知道去哪里看,我不想用不必要的信息向这个问题发送垃圾邮件。

4

1 回答 1

1

对于任何想知道的人:问题与“--enable-software-rendering”参数有关。一旦我用 flutter 运行flutter run --enable-software-rendering,一切都按预期工作。

于 2021-10-29T13:53:41.613 回答