Почему мой класс CustomPainter Flutter ничего не рисует на экране при использовании функции canvas..drawArc() с углом развертки менее 2*пи?

#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*пи: Компонент с разверткой менее 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 , все сработало, как и ожидалось.