如何在颤动中停止动画持续时间?

问题描述

我这里有一个关于递减计时器的代码。我想在 5 秒后或在某个时间停止计时器。如何使用颤振实现这一目标?这是一个示例代码

class MyHomePage1 extends StatefulWidget {
      MyHomePage1({Key key,this.title}) : super(key: key);
    
       final String title;
     
       @override
       _MyHomePage1State createState() => _MyHomePage1State();
     }
     
     class _MyHomePage1State extends State<MyHomePage1> with TickerProviderStateMixin {
       int _counter = 0;
       AnimationController _controller;
       int levelClock = 180;
     
       void _incrementCounter() {
         setState(() {
           _counter++;
         });
       }
     
       @override
       void dispose() {
         _controller.dispose();
         super.dispose();
       }
     
       @override
       void initState() {
         super.initState();
     
         _controller = AnimationController(vsync: this,duration: Duration(seconds: levelClock) // gameData.levelClock is a user entered number elsewhere in the applciation
             );
     
         _controller.forward();
       }
     
       @override
       Widget build(BuildContext context) {
         return Scaffold(
           appBar: AppBar(
             title: Text(widget.title),),body: Center(
             child: Column(
               mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
                 Countdown(
                   animation: StepTween(
                     begin: levelClock,// THIS IS A USER ENTERED NUMBER
                     end: 0,).animate(_controller),Text(
                   'You have pushed the button this many times:',Text(
                   '$_counter',style: Theme.of(context).textTheme.headline4,],floatingActionButton: FloatingActionButton(
             onpressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),);
       }
     }
     
     class Countdown extends AnimatedWidget {
       Countdown({Key key,this.animation}) : super(key: key,listenable: animation);
       final Animation<int> animation;
     
       @override
       build(BuildContext context) {
         Duration clockTimer = Duration(seconds: animation.value);
     
         String timerText = '${clockTimer.inMinutes.remainder(60).toString()}:${clockTimer.inSeconds.remainder(60).toString().padLeft(2,'0')}';
     
         return Column(
           children: [
             Text(
               "$timerText",style: TextStyle(
                 fontSize: 110,color: Theme.of(context).primaryColor,);
       }
     }

解决方法

实现此目的的一种方法是向动画添加侦听器,就像这样。

Countdown(
  animation: StepTween(
    begin: levelClock,end: 0,).animate(_controller)
    ..addListener(() {
      if (_controller.value > (4 / levelClock)) {    //4 = to stop after 5 seconds
        _controller.stop();
      }
    }),),

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...