Flutter 计时器跳过分钟,几分钟后无法正常工作
我已经创建了一个从30分钟开始到0的计时器。但我注意到它只在前3分钟正常工作,但在那之后,它开始跳过几分钟,有时会立即停止或返回0。为了展示这个问题,我创建了一个可以在这里运行的dartpad- 相同的完整代码如下所示:-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 {
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()
,以成功实现该功能。thisstartMinTimer()代码>必须在initState
方法中,而不是在build
中。他应该得到一个正确的解释,因为这是颤振的基本概念之一。谢谢@Dude的回答