Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 从父窗口小部件颤振启动和停止秒表_Flutter_Dart_Timer_Stopwatch - Fatal编程技术网

Flutter 从父窗口小部件颤振启动和停止秒表

Flutter 从父窗口小部件颤振启动和停止秒表,flutter,dart,timer,stopwatch,Flutter,Dart,Timer,Stopwatch,我有一个有状态的秒表小部件,我在多个页面上使用这个小部件。我启动秒表加载,但我想停止秒表在某些情况下从我的父母小部件,但这是不工作 我的秒表密码 class StopWatch extends StatefulWidget { start() => createState().start(); stop() => createState().stop(); @override _StopWatchState createState() => _StopWatc

我有一个有状态的秒表小部件,我在多个页面上使用这个小部件。我启动秒表加载,但我想停止秒表在某些情况下从我的父母小部件,但这是不工作

我的秒表密码

class StopWatch extends StatefulWidget {
  start() => createState().start();
  stop() => createState().stop();

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

class _StopWatchState extends State<StopWatch> {

  String timeToDisplay = '00:00:00';
  Stopwatch swatch = Stopwatch();
  final duration = const Duration(seconds: 1);

  void startTimer() {
    Timer(duration, keepRunning);
  }

  void keepRunning() {
    if (swatch.isRunning) {
      startTimer();
    }

    setState(() {
      var hours = swatch.elapsed.inHours.toString().padLeft(2, "0");
      var minutes = (swatch.elapsed.inMinutes % 60).toString().padLeft(2, "0");
      var seconds = (swatch.elapsed.inSeconds % 60).toString().padLeft(2, "0");

      timeToDisplay = hours + ':' + minutes + ':' + seconds;
    });
  }

  void start() {
    swatch.start();
    startTimer();
  }

  void stop() {
    swatch.stop();
  }

  void pause() {

  }

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

  @override
  void setState(fn) {
    if(mounted){
      super.setState(fn);
    }
  }
  
  @override
  void dispose() {
    // TODO: implement dispose
    swatch.stop();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(
        timeToDisplay,
        style: TextStyle(
            fontSize: 50.0, fontWeight: FontWeight.bold),
      ),
    );
  }
}
类秒表扩展StatefulWidget{
start()=>createState().start();
stop()=>createState().stop();
@凌驾
_StopWatchState createState();
}
类_StopWatchState扩展状态{
字符串timeToDisplay='00:00:00';
秒表样本=秒表();
最终持续时间=恒定持续时间(秒:1);
void startTimer(){
计时器(持续时间、持续修剪);
}
void keepRunning(){
如果(样本正在运行){
startTimer();
}
设置状态(){
var hours=swatch.appeased.inHours.toString().padLeft(2,“0”);
var minutes=(swatch.appeased.inMinutes%60).toString().padLeft(2,“0”);
var seconds=(swatch.appeased.unseconds%60).toString().padLeft(2,“0”);
timeToDisplay=小时+':'+分钟+':'+秒;
});
}
void start(){
swatch.start();
startTimer();
}
无效停止(){
swatch.stop();
}
无效暂停(){
}
@凌驾
void initState(){
//TODO:实现initState
start();
super.initState();
}
@凌驾
无效设置状态(fn){
如果(已安装){
超级设定状态(fn);
}
}
@凌驾
无效处置(){
//TODO:实现dispose
swatch.stop();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回容器(
子:文本(
显示时间,
样式:TextStyle(
fontSize:50.0,fontWeight:fontWeight.bold),
),
);
}
}
父窗口小部件

class RecordTrackScreen extends StatefulWidget {
  static String id = 'record-track';

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

class _RecordTrackScreenState extends State<RecordTrackScreen> {
  stopTimer() {
    if (condition is true) {
      StopWatch().stop();
    }
  }
}
类RecordTrackScreen扩展StatefulWidget{
静态字符串id='record track';
@凌驾
_RecordTrackScreenState createState()=>RecordTrackScreenState();
}
类_RecordTrackScreenState扩展状态{
停止计时器(){
如果(条件为真){
秒表停止;
}
}
}
若条件满足但秒表未停止,则StopTimer正在调用stop方法。 在秒表课上,我试着让秒表停下来,只是为了交叉核对,但效果很好

省道板Url-


我不确定我做错了什么。请帮助。

这行代码无法停止秒表,因为它正在停止一个与您使用的秒表不同的新实例

StopWatch().stop();
使用布尔值控制秒表的停止和启动

MyWidget更改为有状态widget

bool isStop=false;
@凌驾
小部件构建(构建上下文){
返回列(子项:[
秒表(isStop:isStop),
升起的按钮(
已按下:(){
设置状态(){
isStop=true;
});
},
子项:文本(“停止”),
升起的按钮(
已按下:(){
设置状态(){
isStop=false;
});
},
子项:文本('start'))
]);
}
秒表:

类秒表扩展StatefulWidget{
最后的布尔伊斯托普;
常量秒表({Key-Key,this.isStop}):超级(Key:Key);
@凌驾
_StopWatchState createState();
}
类_StopWatchState扩展状态{
//…一些代码
@凌驾
void didUpdateWidget(秒表旧控件){
super.didUpdateWidget(oldWidget);
//检查isStop值是否与以前的状态不同
//此函数将在每次生成此小部件时触发
if(oldWidget.isStop!=widget.isStop){
widget.isStop?停止():开始();
}
}
不建议在父窗口小部件中调用窗口小部件函数,因为每次构建时,都会有一个新的窗口小部件实例


谢谢你的回复。我试过了,但它不起作用。我想我做错了什么。共享省道板url。但当我在秒表内启动和停止时,它工作正常。只是我无法从家长处触发启动和停止。如果你尝试从家长处启动计时器,它将不会启动。我没有使用计时器,我使用的是S这里的topwatch我已经按照建议进行了更改,即使它不工作。请您查看一下dart url,看看我做错了什么。