Приложение простого таймера, в котором подсчитывает количество секунд, прошедших с момента его запуска, показывает неправильное время
Я новичок в флаттере и решил создать простое приложение для таймера, которое подсчитывает количество секунд, прошедших с момента его запуска, и в конечном итоге показывает неправильное время. Таймер запускается с 0, затем увеличивается до 1, и с этого момента кажется, что он растет экспоненциально.
main.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.
Секунда приложения рассчитывается через 15 секунд после ее запуска.
1 ответ
В настоящее время вы определяете новый Timer
каждую секунду. Каждый из этих таймеров увеличивает количество секунд.
Вы хотите определить свой Timer
только один раз и за пределами build
метод.
- Создать таймер в
initState
- Обновлять состояние каждую секунду
- Отобразите секунды в
build
метод - Отменить
Timer
вdispose
Вот пример:
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();
}
}