更新CustomPaint绘图

问题描述

我的CustomPainter窗口小部件有问题。我想绘制一个可以正常工作的PieChart,然后添加一个Variable,将Chart绘制到该变量,直到达到该角度为止。现在,我要对其进行动画处理,我使用了Future.delayed函数,并在其中使用setState来更新变量,但不幸的是,该方法无法正常工作。

也许我太愚蠢了,无法理解我在做错什么,无法找到正确的答案... 但是如果可以的话,您可以帮我的忙。

如果有所作为,我正在为网络开发。

感谢您的帮助!

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:stats/data/listLanguages.dart';
import 'painter/pieChartPainter.dart';

class Chart extends StatefulWidget {
  ListLanguages listLanguages;

  Chart({ListLanguages listLanguages}) {
    if (listLanguages == null) {
      listLanguages = new ListLanguages();
    }

    this.listLanguages = listLanguages;
  }

  @override
  _ChartState createState() => _ChartState();
}

class _ChartState extends State<Chart> {
  @override
  Widget build(BuildContext context) {
    List angles = widget.listLanguages.calcCounts();

    int angle = 0;
    Future.delayed(new Duration(seconds: 2),(){
      setState(() {
        angle = 360;
        print("test");
      });
    });

    return Column(
      children: [
        Spacer(flex: 2),Row(
          children: [
            Spacer(),CustomPaint(
              size: Size.square(400),painter: PieChartPainter(
                angles: angles,colors: new List()
                  ..add(Colors.green)
                  ..add(Colors.blue)
                  ..add(Colors.brown)
                  ..add(Colors.pink)
                  ..add(Colors.orange)
                  ..add(Colors.grey.shade700),angle: angle,),Spacer(flex: 10),],Spacer(flex: 3),);
  }
}
import 'package:flutter/material.dart';
import 'package:vector_math/vector_math.dart' as vm;

class PieChartPainter extends CustomPainter {
  List angles,colors;
  int angle;

  PieChartPainter(
      {@required List angles,@required List colors,int angle: 360}) {
    this.angles = angles;
    this.colors = colors;
    this.angle = angle;
  }

  @override
  void paint(Canvas canvas,Size size) {
    Paint p = new Paint();
    double start = -90;
    double tmp = 0;

    for (int i = 0; i < angles.length; i++) {
      if (i < 5) {
        p.color = colors[i];
      } else {
        p.color = colors[5];
      }

      if (tmp + angles[i] < angle) {
        canvas.drawArc(Rect.fromLTRB(0,size.width,size.height),vm.radians(start),vm.radians(angles[i]),true,p);

        start = start + angles[i];
        tmp = tmp + angles[i];
      } else {
        double x = angle - tmp;
        canvas.drawArc(Rect.fromLTRB(0,vm.radians(x),p);
        return;
      }
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

这是创建饼图所需的完整代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)