【问题标题】:How to make a timer constantly display如何让计时器不断显示
【发布时间】:2021-12-29 13:31:21
【问题描述】:

我制作了一个国际象棋时钟,但时间只有在您单击其中一个按钮时才会更新,我想要它,所以时间会不断更新。按下按钮后我有 setState() 函数,但没有别的。每隔 10 秒左右更新一次,这怎么会让人生气。谢谢。这是我的代码:

import 'package:flutter/material.dart';

...
  Widget build(context) {
    return MaterialApp(
      home: Scaffold(// this is what creates the page, everything should be inside this cuz everything is inside the page
        appBar: AppBar(//what is displayed at the top WOW
          title: Text('chess clock'),
          
        ),
        body: Column(
          children: [
            Container(
              margin: EdgeInsets.all(150.0),
              child: RaisedButton(
                onPressed: () {
                  setState((){
                    if (button1==1){
                      button1=2;
                    
                      minus=minus2-minus;
                      fminus=fminus+minus;
                      
                      print(minus);
                      
                      
                      divid=DateTime.now().microsecondsSinceEpoch/1000000-start/1000000;
                      divid.round();
                      divid=divid-fminus;
                      minus=DateTime.now().microsecondsSinceEpoch/1000000;
                      divid=60.0-divid;
                    }
                  });
                  
                },
                child: Text(divid.round().toString()),
              )
            
            ),
            Container(
              margin: EdgeInsets.all(150.0),
              child: RaisedButton(
                onPressed: () {
                  setState((){
                    if (button1==2){
                      button1=1;

                      minus2=minus-minus2;
                      fminus2=fminus2+minus2;
                      
                      
                      
                      divid2=DateTime.now().microsecondsSinceEpoch/1000000-start/1000000;
                      divid2.round();
                      divid2=divid2-fminus2;
                      minus2=DateTime.now().microsecondsSinceEpoch/1000000;
                      divid2=60.0-divid2;
                    }
                  
                  });
                  
                },
                child: Text(divid2.round().toString()),
           ...

【问题讨论】:

  • 需要定时调用Timer,调用setState。看看Timer.periodic
  • 每次定时器更新时都会切换到按钮 2。一个国际象棋时钟实际上是两个时钟,对吧?使按钮单击更改时钟,创建一个二元数组来保存每个计时器的值,并更新计时器函数以对活动时钟进行倒计时。如前所述,每次定时器更新时钟(每秒 10 次)时,按钮 1 的值都会为 2。感觉就像点击按钮什么都不做。

标签: flutter dart widget


【解决方案1】:

要获得完整的解决方案,您应该将 Kauli 的代码放入您的 initState() 方法并在 dispose() 中将其删除。它看起来像这样。

我做了一些小的改动以满足解决方案的需要。

编辑:我添加了周围的 StatefulWidget 类并删除了一些令人困惑的剪切和粘贴。您可以使用原始的 Scaffold 和其他小部件包装构建方法。为了让答案更清楚一点,我把它省略了。

class ChessClock extends StatefulWidget {

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

class _ChessClockState extends State<ChessClock> {

  // Important to capture the timer object reference
  Timer chessClockTimer;

  Timer periodicSec()  {
    // How could this be made to updating every 10th of a second or so. 
    // Per op question
    return Timer.periodic(Duration(milliseconds: 10), (_){
      setState((){
        if (button1==2){
          button1=1;

          minus2=minus-minus2;
          fminus2=fminus2+minus2;

          divid2=DateTime.now().microsecondsSinceEpoch/1000000-start/1000000;
          divid2.round();
          divid2=divid2-fminus2;
          minus2=DateTime.now().microsecondsSinceEpoch/1000000;
          divid2=60.0-divid2;
        }
      });
    });
  }

  @override
  void initState() {
    super.initState();
    chessClockTimer = periodicSec(); // Kauli's code 
  }

  @override
  void dispose() {
    // Stop the timer
    chessClockTimer?.cancel();

    // Clean up the timer
    chessClockTimer?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // Your build method code
  }
}

【讨论】:

  • 作为一种良好的风格,您应该只在 setState() 函数体中包含必要的最小值。就像“计算一堆东西”后跟 setState(() { divid2=60.0-divid2;}
  • 如果您喜欢这个答案,请将其标记为已接受的答案。
【解决方案2】:

您可以使用 Timer.periodic 来执行此操作

void periodicSec()  {
  Timer.periodic(Duration(seconds: 1), (_){
    setState((){
      if (button1==2){
        button1=1;

        minus2=minus-minus2;
        fminus2=fminus2+minus2;



        divid2=DateTime.now().microsecondsSinceEpoch/1000000-start/1000000;
        divid2.round();
        divid2=divid2-fminus2;
        minus2=DateTime.now().microsecondsSinceEpoch/1000000;
        divid2=60.0-divid2;
      }
    });
  });
}

【讨论】:

  • 我在回答中扩展了@kauli 的解决方案。我希望允许信用共享。这个答案严格回答了操作问题,但我的答案更完整。
  • 非常感谢您的帮助,但我的朋友和我不明白您对全班最高层做了什么,所以您能否给我们一些您将放置的代码和最高层打电话给班级?谢谢
  • 你能发布更多你的代码吗?如果它足够小,就像完整的小部件一样?我假设你是在 StatefulWidget 中执行此操作的。
  • 导入 'package:flutter/material.dart';导入“飞镖:异步”; void main() { runApp(MyApp()); } 类 MyApp 扩展 StatefulWidget { @override State createState() { return _MyAppState(); } } 类 _MyAppState 扩展 State{ int start=DateTime.now().microsecondsSinceEpoch;双除=0.0;双除2=0.0;双减=DateTime.now().microsecondsSinceEpoch/1000000;双减2=DateTime.now().microsecondsSinceEpoch/1000000;双 fminus=0.0;双 fminus2=0.0;整数按钮1 = 1;双启动时间=60.0;
  • 是可读的这是一个链接:ctxt.io/2/AABgEVAAEw
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多