Flutter как остановить пользовательский индикатор выполнения рисования

#flutter

#flutter

Вопрос:

Я создал что-то вроде индикатора прогресса, следуя некоторому руководству на YouTube.

Это код

 final Gradient gradient = new LinearGradient(
  colors: <Color>[
    Colors.greenAccent.withOpacity(1.0),
    Colors.yellowAccent.withOpacity(1.0),
    Colors.redAccent.withOpacity(1.0),
  ],
  stops: [
    0.0,
    0.5,
    1.0,
  ],
);

class Circular_arc extends StatefulWidget {
  const Circular_arc({
    Key key,
  }) : super(key: key);

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

class _Circular_arcState extends State<Circular_arc> with SingleTickerProviderStateMixin {


  Animation<double> animation;
  AnimationController animController;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    animController = AnimationController(duration:Duration(seconds: 3),vsync: this);

    final curvedAnimation  = CurvedAnimation(parent: animController,curve: Curves.easeInOutCubic);

    animation = Tween<double>(begin: 0.0,end: 3.14).animate(curvedAnimation)..addListener(() {
      setState(() {

      });
    });
    animController.repeat(reverse: true);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Stack(
        children: [
          CustomPaint(
            size: Size(300,300),
            painter: ProgressArc(null, Colors.black54, true),
          ),
          CustomPaint(
            size: Size(300,300),
            painter: ProgressArc(animation.value, Colors.redAccent, false),
          ),
          Positioned(
              top:120,
              left:130,
              child:Text("${(animation.value/3.14 * 100).round()}%",style:TextStyle(color:Colors.red,fontSize:30))
          )
        ],

      ),
    );
  }
}

class ProgressArc extends CustomPainter{

  bool isBackground;
  double arc;
  Color progressColor;

  ProgressArc(this.arc,this.progressColor,this.isBackground);

  @override
  void paint(Canvas canvas, Size size) {
    final rect = Rect.fromLTRB(0,0, 300, 300);
    final startAngle = -math.pi;
    final sweepAngle = arc != null ? arc : math.pi;
    final userCenter  = false;
    final paint = Paint()
      ..strokeCap = StrokeCap.round
      ..color = progressColor
      ..style = PaintingStyle.stroke
      ..strokeWidth = 20;

    if(!isBackground){
      paint.shader = gradient.createShader(rect);
    }
    canvas.drawArc(rect, startAngle, sweepAngle, userCenter, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    // TODO: implement shouldRepaint
    return true;
  }
}
 

Это выглядит так

введите описание изображения здесь

Проблема в том, что он не останавливается, означает, что градиент в индикаторе выполнения непрерывно перемещается, как будто он переходит от 0 к 100%, а затем снова перезапускается, мне нужно это остановить.

Я пытаюсь это сделать со дня на день, но не знаю, что я могу сделать в этом

Ответ №1:

Просто удалите эту строку кода:

  animController.repeat(reverse: true);
 

Так что ваш initState выглядит следующим образом:

   @override
  void initState() {
    // TODO: implement initState
    super.initState();

    animController = AnimationController(duration:Duration(seconds: 3),vsync: this);

    final curvedAnimation  = CurvedAnimation(parent: animController,curve: Curves.easeInOutCubic);

    animation = Tween<double>(begin: 0.0,end: 3.14).animate(curvedAnimation)..addListener(() {
      setState(() {

      });
    });
  }
 

Комментарии:

1. я уже пробовал это, но если я удалю это, цвета gradeint не будут отображаться на черной части. Я имею в виду, что отображается только черная часть индикатора выполнения, но цветная анимация, которая перемещается по черной части, не отображается