【问题标题】:Simple timer App where it counts the number of seconds that have gone by since it's start shows an incorrect time简单的计时器应用程序,它计算自启动以来经过的秒数,显示不正确的时间
【发布时间】:2020-02-20 12:38:25
【问题描述】:

我是 Flutter 的新手,因此决定构建一个简单的计时器应用程序,该应用程序计算自启动以来经过的秒数,并最终显示错误的时间。计时器从 0 开始,然后递增到 1,从那时起,它似乎呈指数增长。

ma​​in.dart

import 'package:flutter/material.dart';
import 'app.dart';

void main() => runApp(App());

app.dart

import 'package:flutter/material.dart';
import 'package:async/async.dart';
import 'clock_widget.dart';

class App extends StatelessWidget {
 @override

 Widget build(BuildContext context) {
  return MaterialApp(
  title: "Timer",
  home: Scaffold(
    appBar: AppBar(
      title: Text("Timer"),
      centerTitle: true,
    ),
    body: Row(
      mainAxisSize: MainAxisSize.max,
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Column(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            ClockWidget(),
            Text("seconds", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 35),)
          ],
        )
      ],
    )
  ),
);
}

clock_widget.dart

import 'dart:async';
import 'package:flutter/material.dart';

class ClockWidget extends StatefulWidget {
  @override
  ClockWidgetState createState() => ClockWidgetState();
}

class ClockWidgetState extends State<ClockWidget> {
  @override
  int _secondCount = 0;

  Widget build(BuildContext context) {
    Timer.periodic(Duration(seconds: 1), (Timer t) => (setState(() {_secondCount+=1;})));
    print("${_secondCount}");
    return Text("${_secondCount}", style: TextStyle(fontSize: 75, color: Color.fromRGBO(30, 144, 255, 1)),);
  }
}

我尝试了很多方法,但对我来说,这似乎是最简单的一种,而且在逻辑上它似乎是正确的。每隔一秒调用一次 setState 会增加 _secondsCount。

The app's second count hardly 15 seconds after running it.

【问题讨论】:

  • 你试过_secondCount=t.tickintsead 的递增吗?
  • 每秒,在每次构建方法调用时,您都会创建一个新的 Timer。所有这些计时器都在 _secondCount 中增加一秒。在 initState 中只定义一次 Timer。以下答案中的示例
  • @the0val 不,我没有,但我一定会尝试一下谢谢!

标签: flutter dart flutter-timer


【解决方案1】:

您当前每秒都在定义新的Timers。这些计时器中的每一个都在增加秒数。

您只想在build 方法之外定义一次Timer

  1. initState 中创建一个计时器
  2. 每秒更新一次状态
  3. build方法中显示秒数
  4. 取消dispose中的Timer

这是一个例子:

class ClockWidget extends StatefulWidget {
  @override
  ClockWidgetState createState() => ClockWidgetState();
}

class ClockWidgetState extends State<ClockWidget> {
  Timer _timer;
  int _secondCount = 0;

  @override
  void initState() {
    super.initState();
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      setState(() {
        this._secondCount += 1;
      });
    });
  }

  Widget build(BuildContext context) {
    print("${_secondCount}");
    return Text(
      "${_secondCount}",
      style: TextStyle(fontSize: 75, color: Color.fromRGBO(30, 144, 255, 1)),
    );
  }

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }
}

【讨论】:

  • 谢谢!我没有考虑到我每秒都在创建计时器这一事实,秒数的指数增长是一个明确的指标。我会再说一遍谢谢你。
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 2012-11-15
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
相关资源
最近更新 更多