datetime - flutter :保持时间

标签 datetime timer dart flutter stopwatch

尝试显示一个静态计时器,该计时器根据当前东部时间每周重置一次,例如屏幕显示一个计时器,Days : Hours : Minutes : seconds(示例:7: 00 : 00 : 00), 倒计时并在每个星期天结束或星期一开始时自行重置。我有一个总体概念,它涉及 DateTimeTimerStopwatch,但很难将它们组合在一起。

最佳答案

创建一个 StatefulWidget,它在您的 Timer 更新时获取并存储当前时间。在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);
}

关于datetime - flutter :保持时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51451662/

相关文章:

MySQL:插入错误 "Cannot be NULL"-- DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

java - 简单日期格式解析日期时出错

python - 将日期时间对象列表转换为自特定日期以来的天数列表

regex - Dart Regex用于字母数字,包括破折号和空格,但不能为空白字符串

flutter - 如何在 flutter 中激活/选中复选框后保持边框

java - JDK8 LocalDate.toEpochDay 性能异常下降

c - MSP430 - 如何将定时器 A1 中断用于不同目的?

c - 主从配置中的 STM32 奇数定时器 1 行为 - mb 代码问题

python - 如何让我的程序休眠 50 毫秒?

javascript - AngularDart 4-5 变更检测与 Angular 5 变更检测有何不同?