#flutter #dart #pie-chart #custom-painter
Вопрос:
По какой-то причине мой пользовательский художник ничего не рисует на экране. Я пытаюсь построить круговую диаграмму, но художник работает только тогда, когда я устанавливаю круговую диаграмму на 2*пи.
Виджет, в котором вызывается CustomPaint, имеет следующую структуру:
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 Listlt;Categorygt; 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 lt; 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; } }
Я почти наверняка могу сказать, что проблема не имеет ничего общего с данными и цветами, которые я предоставляю, потому что всякий раз, когда я регистрирую текущие элементы в консоли, она выдает правильный вывод. Здесь вы можете увидеть структуру моего виджета:
И вот изображение самого компонента: (Обратите внимание, что для всего круга отображается только последний цвет категории, потому что всякий раз, когда я использую полосу развертки, которая меньше 2*pi, весь виджет не отображает цвета.)
Это компонент, когда я устанавливаю полосу развертки, которая меньше 2*пи:
Я действительно не могу понять, что может быть причиной этой проблемы. У кого-нибудь есть представление о том, на что еще влияет параметр sweepAngle? Я также понятия не имею, почему цветные круги слева от отдельных категорий не видны, потому что они отображаются в совершенно другой ветви виджета… Если у вас есть какие-либо идеи о том, как решить эту проблему, я был бы более чем рад предоставить дополнительную информацию, но пока я не знаю, где искать, я не хочу спамить эту проблему ненужной информацией.
Комментарии:
1. просто для тестирования: попробуйте
for (var index = 0; index lt; 1; index ) {
и используйтеcanvas.drawArc( rect, startRadian, pi / 2, false, paint, );
2. @pskink, когда я изменяю заголовок цикла for на «… индекс Круг просто становится синим вместо розового (как и ожидалось), но когда я изменяю вызов функции drawArc (), он снова выглядит как последнее изображение.
3. так что, если вы сделаете
canvas.drawArc(rect, startRadian, pi / 2, false, paint, );
, будет нарисован полный круг? и ни одной четверти?4. @pskink Не совсем так. Когда я использую
canvas.drawArc(rect, startRadian, pi / 2, false, paint, );
его, он выглядит как последнее изображение поста. Это означает, что никаких кругов вообще не видно. Но когда я оставляю стрелку на 2 * pi и просто меняю заголовок цикла for, тогда — как и ожидалось — полный круг рисуется синим цветом.5. @pskink Я скопировал вашу реализацию CustomPainter и заменил PieChartPainter в дереве виджетов на этот. К сожалению, это все еще показывает ту же проблему. Когда я запускаю приложение с вашим точным кодом, круги не отображаются. Но когда я делаю только одно изменение от
canvas.drawArc(rect, st, sw, true, paint..color = zip[1] as Color);
доcanvas.drawArc(rect, st, 2 * pi, true, paint..color = zip[1] as Color);
, на нем появляется большой круг голубого цвета, а также маленькие кружочки слева от названий категорий.
Ответ №1:
Для тех, кому интересно: проблема была связана с аргументом «—включить-программное обеспечение-рендеринг». Как только я запустил flutter flutter run --enable-software-rendering
, все сработало, как и ожидалось.