Asynchronous 颤振:使用同一按钮启动和停止计时器

Asynchronous 颤振:使用同一按钮启动和停止计时器,asynchronous,flutter,dart,timer,widget,Asynchronous,Flutter,Dart,Timer,Widget,我有一个秒表,想有一个单一的按钮,暂停和启动它。我正在与这一逻辑作斗争。当打印到控制台时,布尔值被设置为false,不允许我重新单击按钮 秒表.省道: 第一次单击第一个按钮时,秒表应开始运行。第二次单击时,它应该暂停。我通过在start和stop watch方法中添加setState来解决您的代码,翻转所述方法中的逻辑,并在onPressed回调中的startOrStop之前添加=>这就是dealbreaker。 此外,我删除了startStop=false;来自updateTimer。我简化了

我有一个秒表,想有一个单一的按钮,暂停和启动它。我正在与这一逻辑作斗争。当打印到控制台时,布尔值被设置为false,不允许我重新单击按钮

秒表.省道:


第一次单击第一个按钮时,秒表应开始运行。第二次单击时,它应该暂停。

我通过在start和stop watch方法中添加setState来解决您的代码,翻转所述方法中的逻辑,并在onPressed回调中的startOrStop之前添加=>这就是dealbreaker。 此外,我删除了startStop=false;来自updateTimer。我简化了startOrStop if语句,因为在检查布尔值时不需要写==true,在计算布尔值时只需写ifstartStop即可

工作示例:

导入“dart:async”; 进口“包装:颤振/材料.省道”; 类NewStopWatch扩展StatefulWidget{ @凌驾 _NewStopWatchState createState=>\u NewStopWatchState; } 类_NewStopWatchState扩展状态{ 秒表=秒表; 定时器; bool startStop=true; 字符串elapsedTime=; 更新计时器{ 如果手表正在运行{ 设定状态{ printstartstop Inside=$startStop; elapsedTime=转换毫秒样本。elapsedTime毫秒; }; } } @凌驾 小部件构建上下文上下文{ 返回容器 填充:EdgeInsets。全部20.0, 子:列 儿童:[ TextelapsedTime,样式:TextStylefontSize:25.0, 尺寸箱高度:20.0, 一行 mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 浮动操作按钮 heroTag:btn1, 背景颜色:Colors.red, 按下时:=>开始或停止, 孩子:IconIcons.pause, SizedBoxwidth:20.0, 浮动操作按钮 heroTag:btn2, 背景颜色:Colors.green, onPressed:null,//resetWatch, 孩子:IconIcons.check, ], ], , ; } startOrStop{ ifstartStop{ startWatch; }否则{ 秒表 } } startWatch{ 设定状态{ startStop=false; 观察,开始; timer=timer.PeriodicDurationMillics:100,updateTime; }; } 秒表{ 设定状态{ startStop=true; 看,停; 设定时间; }; } 设定时间{ var timeSoFar=watch.elapsedmillisons; 设定状态{ elapsedTime=转换毫秒时间距离; }; } 将毫秒转换为毫秒{ 整数百分之一百=毫秒/10.5; 整数秒=百分之一百。截断; int分钟=秒/60.5秒截断; 整小时=分钟/60.5分钟; 字符串hourstr=hours%60.toString.padLeft2,“0”; 字符串minutesStr=minutes%60.toString.padLeft2,“0”; 字符串secondsStr=seconds%60.toString.padLeft2,“0”; return$hoursStr:$minutesStr:$secondsStr; } }
我通过在start和stop watch方法中添加setState解决了您的代码,翻转了所述方法中的逻辑,并在onPressed回调中添加了=>before startOrStop这就是dealbreaker。 此外,我删除了startStop=false;来自updateTimer。我简化了startOrStop if语句,因为在检查布尔值时不需要写==true,在计算布尔值时只需写ifstartStop即可

工作示例:

导入“dart:async”; 进口“包装:颤振/材料.省道”; 类NewStopWatch扩展StatefulWidget{ @凌驾 _NewStopWatchState createState=>\u NewStopWatchState; } 类_NewStopWatchState扩展状态{ 秒表=秒表; 定时器; bool startStop=true; 字符串elapsedTime=; 更新计时器{ 如果手表正在运行{ 设定状态{ printstartstop Inside=$startStop; elapsedTime=转换毫秒样本。elapsedTime毫秒; }; } } @凌驾 小部件构建上下文上下文{ 返回容器 填充:EdgeInsets。全部20.0, 子:列 儿童:[ TextelapsedTime,样式:TextStylefontSize:25.0, 尺寸箱高度:20.0, 一行 mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 浮动操作按钮 heroTag:btn1, 背景颜色:Colors.red, 按下时:=>开始或停止, 孩子:IconIcons.pause, SizedBoxwidth:20.0, 浮动操作按钮 heroTag:btn2, 背景颜色:Colors.green, onPressed:null,//resetWatch, 孩子:IconIcons.check, ], ], , ; } startOrStop{ ifstartStop{ startWatch; }否则{ 秒表 } } startWatch{ 设定状态{ startStop=false; 观察,开始; timer=timer.PeriodicDurationMillics:100,updateTime; }; } 秒表{ 设定状态{ startStop=true; 看,停; 设定时间; }; } 设定时间{ var timeSoFar=watch.elapsedmillisons; 设定状态{ elapsedTime=转换毫秒时间距离; }; } 将毫秒转换为毫秒{ 整数百分之一百=毫秒/10.5; 整数秒=百分之一百。截断; int分钟=秒/60.5秒截断; 整小时=分钟/60.5分钟; 字符串hourstr=hours%60.toString.padLeft2,“0”; 字符串minutesStr=minutes%60.toString.padLeft2,“0”; 字符串secondsStr=seconds%60.toString.padLeft2,“0”; return$hoursStr:$minutesStr:$secondsStr; } }
谢谢你的工作示例。这帮助我解决了一个类似的问题

如果它对任何人都有帮助,我在flarkmarup的代码中添加了一些内容,这样图标就更符合流程

在顶部,我添加了一个变量: IconData btnPlayStatus=Icons.play_箭头

在FloatingActionButton btn1中,我将图标替换为变量,如: 孩子:IconbtPlayStatus

然后将SetState添加到startOrStop,如下所示:

  startOrStop() {
    if(startStop) {
      setState(() {
        btnPlayStatus = Icons.pause;
      });
      startWatch();
    } else {
      setState(() {
        btnPlayStatus = Icons.play_arrow;
      });
      stopWatch();
    }
  }

谢谢你的工作示例。这帮助我解决了一个类似的问题

如果它对任何人都有帮助,我在flarkmarup的代码中添加了一些内容,这样图标就更符合流程

在顶部,我添加了一个变量: IconData btnPlayStatus=Icons.play_箭头

在FloatingActionButton btn1中,我将图标替换为变量,如: 孩子:IconbtPlayStatus

然后将SetState添加到startOrStop,如下所示:

  startOrStop() {
    if(startStop) {
      setState(() {
        btnPlayStatus = Icons.pause;
      });
      startWatch();
    } else {
      setState(() {
        btnPlayStatus = Icons.play_arrow;
      });
      stopWatch();
    }
  }

现在还不能回答您的解决方案,但有一些简单的问题:为什么命名布尔startStop?知道“真”的值将产生什么结果是不必要的复杂。它应该启动还是停止计时器?还有,为什么要在秒表中多次设置startStop?我最初将其设置为true,打算第一次单击按钮调用startWatch方法。stopWatch中的不同值是为了实验目的,目前还不能回答您的解决方案,但有一些简单的问题:为什么要命名布尔startStop?知道“真”的值将产生什么结果是不必要的复杂。它应该启动还是停止计时器?还有,为什么要在秒表中多次设置startStop?我最初将其设置为true,打算第一次单击按钮调用startWatch方法。秒表中的不同值是为了实验目的谢谢!这正是我想要的!onPressed:=>startOrStop和onPressed:startStop之间的区别是什么?它们不都调用该方法吗?您应该编写onPressed:{your code here},但该方法的语法是简写的。一篇强调这个问题的文章。另一个例子谢谢!这正是我想要的!onPressed:=>startOrStop和onPressed:startStop之间的区别是什么?它们不都调用该方法吗?您应该编写onPressed:{your code here},但该方法的语法是简写的。一篇强调这个问题的文章。另一种语法