Datetime 颤振:保持时间

Datetime 颤振:保持时间,datetime,timer,dart,flutter,stopwatch,Datetime,Timer,Dart,Flutter,Stopwatch,试图显示一个基于当前东部时间每周重置自身的静态计时器,例如,屏幕显示一个计时器,天:小时:分钟:秒(例如:7:00:00:00),倒计时并在每个周日结束或周一开始时重置自身。我有一个一般的概念,它包括DateTime、Timer和Stopwatch,但很难将它们组合在一起。创建一个StatefulWidget,每当定时器更新时,它就会获取并存储当前时间。在build方法中,计算并格式化时差: import 'dart:async'; import 'package:flutter/materi

试图显示一个基于当前东部时间每周重置自身的静态计时器,例如,屏幕显示一个计时器,
天:小时:分钟:秒
(例如:
7:00:00:00
),倒计时并在每个周日结束或周一开始时重置自身。我有一个一般的概念,它包括
DateTime
Timer
Stopwatch
,但很难将它们组合在一起。

创建一个
StatefulWidget
,每当
定时器更新时,它就会获取并存储当前时间。在
build
方法中,计算并格式化时差:

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Week Countdown',
      home: TestPage(),
    );
  }
}

class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Week Countdown')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text(
              'Time until next week:',
              style: Theme.of(context).textTheme.headline,
            ),
            WeekCountdown()
          ],
        ),
      ),
    );
  }
}

class WeekCountdown extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _WeekCountdownState();
}

class _WeekCountdownState extends State<WeekCountdown> {
  Timer _timer;
  DateTime _currentTime;

  @override
  void initState() {
    super.initState();
    _currentTime = DateTime.now();
    _timer = Timer.periodic(Duration(seconds: 1), _onTimeChange);
  }

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

  void _onTimeChange(Timer timer) {
    setState(() {
      _currentTime = DateTime.now();
    });
  }

  @override
  Widget build(BuildContext context) {
    final startOfNextWeek = calculateStartOfNextWeek(_currentTime);
    final remaining = startOfNextWeek.difference(_currentTime);

    final days = remaining.inDays;
    final hours = remaining.inHours - remaining.inDays * 24;
    final minutes = remaining.inMinutes - remaining.inHours * 60;
    final seconds = remaining.inSeconds - remaining.inMinutes * 60;

    final formattedRemaining = '$days : $hours : $minutes : $seconds';

    return Text(formattedRemaining);
  }
}

DateTime calculateStartOfNextWeek(DateTime time) {
  final daysUntilNextWeek = 8 - time.weekday;
  return DateTime(time.year, time.month, time.day + daysUntilNextWeek);
}
导入'dart:async';
进口“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:"一周倒计时",,
主页:TestPage(),
);
}
}
类TestPage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“周倒计时”),
正文:中(
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
正文(
“时间到下周:”,
风格:Theme.of(context).textTheme.headline,
),
WeekCountdown()
],
),
),
);
}
}
类WeekCountdown扩展StatefulWidget{
@凌驾
State createState()=>_WeekCountdownState();
}
类_WeekCountdownState扩展状态{
定时器(u定时器),;
日期时间_currentTime;
@凌驾
void initState(){
super.initState();
_currentTime=DateTime.now();
_计时器=计时器。周期性(持续时间(秒:1),\u onTimeChange);
}
@凌驾
无效处置(){
_timer.cancel();
super.dispose();
}
void\u onTimeChange(计时器){
设置状态(){
_currentTime=DateTime.now();
});
}
@凌驾
小部件构建(构建上下文){
最终开始下一周=计算开始下一周(_currentTime);
最终剩余=开始下一周的差异(_currentTime);
最后天数=剩余的天数;
最后时间=剩余时间内-剩余时间内*24天;
最后分钟=剩余的.inMinutes-剩余的.inHours*60;
最后的秒数=剩余的.inSeconds-剩余的.inMinutes*60;
最终格式化剩余=“$days:$hours:$minutes:$seconds”;
返回文本(格式化剩余);
}
}
DateTime CalculateStartFnextWeek(日期时间){
最后一天SunTilNextweek=8-time.weekday;
返回日期时间(time.year、time.month、time.day+daysuntilneweek);
}
有关性能的更多信息将非常有用