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 - Fatal编程技术网

Flutter 计时器跳过分钟,几分钟后无法正常工作

Flutter 计时器跳过分钟,几分钟后无法正常工作,flutter,dart,Flutter,Dart,我已经创建了一个从30分钟开始到0的计时器。但我注意到它只在前3分钟正常工作,但在那之后,它开始跳过几分钟,有时会立即停止或返回0。为了展示这个问题,我创建了一个可以在这里运行的dartpad- 相同的完整代码如下所示:- import 'dart:async'; import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget {

我已经创建了一个从30分钟开始到0的计时器。但我注意到它只在前3分钟正常工作,但在那之后,它开始跳过几分钟,有时会立即停止或返回0。为了展示这个问题,我创建了一个可以在这里运行的dartpad-

相同的完整代码如下所示:-

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Timer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Timer _timer;
  int _start = 30;

  void startMinTimer() {
    const oneMin = const Duration(minutes: 1);
    _timer = new Timer.periodic(
      oneMin,
      (Timer timer) {
        if (_start == 0) {
          setState(() {
            timer.cancel();
          });
        } else {
          setState(() {
            _start--;
          });
        }
      },
    );
  }

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

  //Todo: fix timer automatically resets to 0 after sometime
  @override
  Widget build(BuildContext context) {
    startMinTimer();
    return Scaffold(
      appBar: AppBar(
        title: Text('Timer Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Minutes Left',
            ),
            Text(
              '$_start',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
    );
  }
}
导入'dart:async';
进口“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“计时器演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
定时器(u定时器),;
int _start=30;
void startMinTimer(){
const oneMin=const持续时间(分钟:1);
_定时器=新定时器。周期性(
一分钟,
(计时器){
如果(_start==0){
设置状态(){
timer.cancel();
});
}否则{
设置状态(){
_开始--;
});
}
},
);
}
@凌驾
无效处置(){
_timer.cancel();
super.dispose();
}
//Todo:修复计时器在某个时间后自动重置为0
@凌驾
小部件构建(构建上下文){
startIntimer();
返回脚手架(
appBar:appBar(
标题:文本(“计时器演示”),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“还剩几分钟”,
),
正文(
“$\u开始”,
风格:Theme.of(context).textTheme.headline4,
),
],
),
),
);
}
}

我想知道到底出了什么问题,我该如何解决。提前感谢。

这里发生的事情是,您正在从build方法调用
startminitimer()
,每次调用
setState()
时,都会运行build方法来更新小部件,从而再次调用
startminitimer()
,之后,将创建一个新的计时器实例,并开始减少
\u start
计数。这个过程重复(递归)


要防止出现这种情况,请确保只调用一次
startIntimer()
。正如您所知,flatter为有状态小部件提供了一个
initState()
方法,该方法在创建小部件时仅运行(运行一次)。您可以从
initState()
方法调用
startMinTimer()
,以成功实现该功能。

this
startMinTimer()必须在
initState
方法中,而不是在
build
中。他应该得到一个正确的解释,因为这是颤振的基本概念之一。谢谢@Dude的回答