asynchronous - 如何在颤振应用程序中显示 5 分钟不可停止的计时器?
问题描述
我想在我的应用程序中显示一个 5 分钟计时器,即使应用程序关闭也不会停止,并以 mm:ss 格式显示剩余时间。如何显示时间?
解决方案
这是一个非常非常基本的示例,说明这种计时器如何工作,它会持续存储目标时间:
class TimerApp extends StatefulWidget {
@override
_TimerAppState createState() => _TimerAppState();
}
class _TimerAppState extends State<TimerApp> {
SharedPreferences prefs;
DateTime target;
String timeLeft = "";
bool running = true;
@override
void initState() async {
super.initState();
prefs = await SharedPreferences.getInstance();
target = DateTime.fromMillisecondsSinceEpoch(prefs.getInt('target'));
if (target == null || target < DateTime.now()) {
target = DateTime.now().add(Duration(minutes: 5));
}
executeTimer();
}
@override
void dispose() {
prefs.setInt('target', target.millisecondsSinceEpoch);
running = false;
super.dispose();
}
void executeTimer() async {
while (running) {
setState(() {
timeLeft = DateTime.now().isAfter(target)
? '5 min expired. Restart app to reset.'
: target.difference(DateTime.now()).toString();
});
await Future.delayed(Duration(seconds: 1), () {});
}
}
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.center,
child: Text(timeLeft),
);
}
}
请注意,这个例子不是很充实;缺少几个功能,使用while (running)
循环可能不是最优雅的解决方案。
以下是您可以查看的更多资源:
- 用于持久保存状态的shared_preferences 包。
- 这个使用更复杂的状态管理形式的Fluttery egg timer 教程。
推荐阅读
- vba - 将段落从多行 texbox 表单复制到 Outlook
- gradle - 为什么 Github 包注册表说我的令牌不在读取包的范围内?
- swift - Swift 5:声明变量时如何指定符合协议的泛型类型
- python - OCR 将零与“o”混淆 - 如何在 python 正则表达式中指定零或字母“o”?
- regex - 正则表达式匹配可能包含方括号 [] 的 json 条目的值
- python - 绘制表情符号和词频
- javascript - 从唯一的 html id 显示数据库中的字段
- reactjs - 将状态传递给另一个组件中的状态 - React
- c - 在 Linux 上将 iconv 与 WCHAR_T 一起使用
- amazon-web-services - 如何防止 Cognito 在没有电子邮件验证的情况下保留用户名/电子邮件?