创建一个倒计时器,每 5 秒打印一次列表中每个值的剩余时间

2024-03-08

我正在尝试在 Flutter 中创建一个倒计时器来打印剩余时间每 5 秒直到计时器用完,然后为值列表中的下一个值运行相同的倒计时器。

下面的递归函数接近,但它在转到下一个值之前等待“迭代”List即使剩下的时间越来越少Timer.

import 'dart:async';

Future main() async {
  final _sequence = [21, 10, 8];
  final _iteration = 5;

  void _countdown(seq) async {
    if (seq.length > 0) {
      var duration = seq[0];
      print('Starting at $duration');
      Timer.periodic(Duration(seconds: _iteration), (timer) {
        var remaining = duration - timer.tick * _iteration;
        if (remaining >= 0) {
          print('$duration, $remaining');
        } else {
          timer.cancel();
          _countdown(seq.sublist(1));
        }
      });
    }
  }

  _countdown(_sequence);
}

每次运行的持续时间由中的值定义_sequence List.

即使使用CountdownTimer(代替Timer.periodic) 当剩余值小于迭代时,也存在等待太长时间的相同问题:

import 'package:quiver/async.dart';

main() {
  final _sequence = [21, 10, 8];
  final _iteration = 5;

  void _countdown(seq) {
    if (seq.length > 0) {
      var duration = seq[0];
      print('Starting at $duration');
      CountdownTimer countdownTimer = CountdownTimer(
        Duration(seconds: duration),
        Duration(seconds: _iteration),
      );

      var sub = countdownTimer.listen(null);
      sub.onData((timer) {
        if (timer.remaining > Duration(seconds: 0)) {
          print('$duration, ${timer.remaining.inSeconds}');
        } else {
          sub.cancel();
          _countdown(seq.sublist(1));
        }
      });
    }
  }

  _countdown(_sequence);
}

除非另有说明,结果应如下所示,行与行之间有 5 秒的暂停:

Starting at 21
21, 16
21, 11
21, 6
21, 1          <-- This one should only pause 1 second before continuing
Starting at 10
10, 5
10, 0          <-- This one should immediately continue
Starting at 8
8, 3           <-- This one should only pause 3 seconds before continuing

Dart/Flutter 支持使用 CountDownTimer 进行倒计时。下面是 2 个示例,一个没有 UI,一个在屏幕中央有一个简单的文本(超时 = 10 秒,步骤 = 1 秒,您可以更改为您想要的任何内容)

示例1:

import 'package:quiver/async.dart';

void main() {
  const timeOutInSeconds = 10;
  const stepInSeconds = 2;
  int currentNumber = 0;

  CountdownTimer countDownTimer = new CountdownTimer(
      new Duration(seconds: timeOutInSeconds),
      new Duration(seconds: stepInSeconds));

  var sub = countDownTimer.listen(null);
  sub.onData((duration) {
    currentNumber += stepInSeconds;
    int countdownNumber = timeOutInSeconds - currentNumber;
    // Make it start from the timeout value
    countdownNumber += stepInSeconds;
    print('Your message here: $countdownNumber');
  });

  sub.onDone(() {
    print("I'm done");

    sub.cancel();
  });
}

示例2:

import 'package:flutter/material.dart';
import 'package:quiver/async.dart';

void main() {
  runApp(new MaterialApp(home: new CountdownTimerPage()));
}

class CountdownTimerPage extends StatefulWidget {
  @override
  CountdownTimerPageState createState() => new CountdownTimerPageState();
}

class CountdownTimerPageState extends State<CountdownTimerPage> {
  final timeOutInSeconds = 10;
  final stepInSeconds = 2;
  int currentNumber = 0;

  CountdownTimerPageState() {
    setupCountdownTimer();
  }

  setupCountdownTimer() {
    CountdownTimer countDownTimer = new CountdownTimer(
        new Duration(seconds: timeOutInSeconds),
        new Duration(seconds: stepInSeconds));

    var sub = countDownTimer.listen(null);
    sub.onData((duration) {
      currentNumber += stepInSeconds;

      this.onTimerTick(currentNumber);
      print('Your message here: $currentNumber');
    });

    sub.onDone(() {
      print("I'm done");

      sub.cancel();
    });
  }

  void onTimerTick(int currentNumber) {
    setState(() {
      currentNumber = currentNumber;
    });
  }

  @override
  Widget build(BuildContext context) {
    int number = timeOutInSeconds - currentNumber;
    // Make it start from the timeout value
    number += stepInSeconds;
    return new Scaffold(
      body: new Center(
          child: new Text(
        "Your message here: $number",
        style: new TextStyle(color: Colors.red, fontSize: 25.0),
      )),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建一个倒计时器,每 5 秒打印一次列表中每个值的剩余时间 的相关文章

  • 为什么 dart 不允许方法重载?

    我尝试在一些 dart 代码中使用方法重载 并很快了解到 dart 中不提供重载 我的问题是 为什么不提供 推荐的替代方案是什么 是否有标准的命名约定 因为执行相同操作但具有不同输入的方法必须具有不同的名称 使用命名参数然后检查调用者是否提
  • 如何设置 dart objectbox 并预填充本地数据库?

    我想用 Flutter 设置一个 ObjectBox 数据库 我想用值预先填充数据库文件 安装应用程序时 数据库文件将被复制并由应用程序使用 我希望能够继续提供架构迁移 是否可以 如何建立这种类型的架构 你有什么例子吗 SOLUTION 通
  • 类型不匹配:推断类型是 PluginRegistry?但 FlutterEngine 是预期的

    我想使用 Flutter Workmanager 我在 kt 中做了引用的配置 如下所示 package com example mybackprocess import be tramckrijte workmanager Workman
  • Flutter 分析/构建在 GitHub 操作中失败

    当运行以下操作时 它会失败flutter analyze 如果我删除它 稍后会失败flutter build 这两个命令在本地都可以正常工作 我理解该消息 但无法理解包路径可能有什么问题 GitHub 操作错误 flutter analyz
  • 如何在 flutter 中用动画 POP

    我正在触发 Navigator pop 事件 并且想要淡出到页面的过渡 我尝试过 Fluro 但没有尝试过 我对实施它不感兴趣 这就是我正在做的 Widget build BuildContext context return Scaffo
  • 如何在 Flutter Android 中创建构建变体,以便每个构建变体都有不同的应用程序 ID?

    我需要有 3 个不同的 APK dev UAT prod 每个 APK 都针对不同的 Firebase 数据库 但在每个 Firebase 项目中 我需要提供一个永久的应用程序 ID 这意味着我需要有 3 个构建变体 每个变体都使用不同的应
  • 当子可滚动部件到达颤振顶部时,如何自动开始滚动父可滚动部件

    这似乎很自然 甚至可能是预料之中的 但我仍然没有找到任何可能有帮助的东西 我在另一个可滚动小部件 父级 中有一个 ScrollablePositionedList 几乎与 ListView 相同 我尝试过 CustomScrollView
  • Flutter - 每次应用程序重新启动后保留变量的值

    在我的一页上 我希望我的用户从一个变量上的默认文本开始 codeDialog 然后我希望他们更改该文本 之后他们编写的文本将成为我的新默认文本 遗憾的是我无法让它发挥作用 现在 当我重新启动应用程序并打开该屏幕时 它会重置为null 我认为
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • 如何让 BottomNavigationBar 粘在键盘颤动的顶部

    我正在尝试制作一个简单的聊天应用程序 所以我创建了一个脚手架和我的身体 将是消息和我的bottomNavigationBar将是我的打字字段和发送图标 我添加了一个文本字段 但键入时导航栏被键盘隐藏 这是我的代码BottomNavigati
  • Dart 包的条件导入/代码

    有没有办法根据 Dart 中的环境标志或目标平台有条件地导入库 代码 我正在尝试在两者之间切换dart io的 ZLibDecoder ZLibEncoder 类和基于目标平台的 zlib js 有一篇文章介绍了如何创建统一的界面 http
  • 滑动时向 PageView 添加新页面

    我目前正在制作一个日历应用程序 我想向右或向左滑动以转到下个月或上个月 我使用 PageView 时首先设置了一个包含 3 个项目的数组 第一个页面是第二个项目 我想向右滑动并在末尾添加一个页面 我想向左滑动并在开头添加一个页面 目前 如果
  • flutter - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引

    我目前正在 Flutter 中使用 SliverList 和 SliverChildBuilderDelegate 构建日历视图 这样我就不必一次渲染日历中的每个项目 第一个日期是纪元时间 即 1970 年 1 月 1 日 最后一个日期是在
  • 如何取消配置 flutterfire?

    我们在 CLI 中使用以下命令将 flutter 应用程序与 firebase 连接 flutterfire configure 如文档中所述 https firebase flutter dev docs overview https f
  • 使用 flutter 处理 Appcheck 时出错

    我想在 firebase 存储中上传文件 但经过多次研究后出现了 appcheck 错误 我发现我必须在 firebase 上激活 Appcheck 而且还要在我的应用程序上激活它 在 youtube 上的谷歌视频中 我看到我必须在构建我的
  • 底部有无限像素溢出的 RenderFlex

    我有一个非常简单的控件 我试图在其中展示DropdownButton与几个TextFields 当应用程序在模拟器中运行时 我收到一条错误消息 BOTTOM OVERFLOWED BY Infinity PIXELS The Stack T
  • 将原生 Twilio Android SDK 与 Flutter 集成

    我正在尝试使用 flutter 创建 IP 语音 VOIP 移动应用程序 我还没有看到 twilio 语音 api 的 flutter 插件的实现 所以我使用 MethodChannel 将我的应用程序与本机 android 语音 api
  • 如何在flutter中实现字母滚动

    有没有任何插件或方法可以在 flutter 中实现这种滚动 具体来说 右侧的字母列 例如突出显示当前字母表字母 或者如果点击某个字母 则滚动视图会直接转到该字母标题 为了按字母顺序排序 我们可以这样做List sort 对于粘性标题 我们也
  • Dart:如何在本机扩展中创建流

    在我的本机扩展中 我需要将整数流式传输到我的 Dart 控制台应用程序 在概念上非常相似 标准输入 如何创建向控制台应用程序公开的本机 Dart Stream 对象 我尝试为您创建一个示例并将其放在 github 上 https githu
  • 带有 ListTiles 和按钮行的 Flutter 下拉菜单

    我正在尝试构建一个自定义下拉菜单 如下所示 我已经成功地实现了ListTiles and Row of Buttons没有下拉菜单 但我不确定如何将所有内容嵌套在下拉菜单类中 这是我到目前为止所得到的 class HomePage exte

随机推荐

  • 如何删除 UIToolBar 上的顶部边框

    我已将 UIToolBar 色调颜色设置为某个值 并且我看到了要删除的边框线 如何去掉这个黑色边框 gt 你可以这样做 self navigationController toolbar clipsToBounds YES
  • d3 按路径制作动画组

    这是我要增强的下一个问题原问题 https stackoverflow com questions 64954518 d3 animate path by arc 64954839 所以我正在尝试的是沿着填充路径为三角形标记和文本工具提示设
  • JNI char[](char数组)的方法描述符是什么?

    我的 JAVA 类代码片段 我想使用 JNI 从我的 C 文件访问 getReg chal 方法 public char getReg chal return reg chal 我的 C 文件执行一些 jni 操作 mid env gt G
  • Facebook 登录窗口在屏幕旋转时关闭

    我已经在我的应用程序中实现了 facebook 登录过程工作正常 当我点击 Facebook 图像时 它会打开 Facebook 登录窗口 但是当我旋转模拟器时 它会关闭登录窗口 任何解决方案 将其添加到您的活动的清单文件中 android
  • Sequelize 测试 - 有时会出现验证错误

    我正在通过 Mocha Chai 对续集定义运行单元测试 如下所示 运行的主要tests jsmocha tests js Testing Dependencies expect require chai expect should req
  • 在 netfilter 挂钩中查找发送数据包的可执行文件的名称

    我正在编写一个内核模块 它使用 netfilter 挂钩来过滤 TCP 数据包 并且需要找出发送数据包的可执行文件的路径 到目前为止 我已经使用了以下方法 但它打印的名称似乎与所使用的可执行文件无关 usr lib firefox fire
  • 如何模拟 aws-sdk gem?

    我有一些代码可以使用以下命令将文件上传到 Amazon S3aws sdk宝石 显然它执行了一个 HTTP put 来上传文件 有没有一种好方法来模拟 aws sdk gem 的此功能 我尝试使用 Webmock 但是 aws sdk ge
  • 如何忽略 Git 合并中的文件?

    我正在开发一个有两个分支的 Django 网站 master and dev master是生产版本 不应直接在此处完成任何工作 所有的改变都应该来自合并dev分支 一旦被认为是稳定的 dev正如您可能猜到的那样 是开发分支 所有更改都在这
  • ViM-LaTeX、python 和 Mac OS 10.8.1 以及一个奇怪的错误

    我刚刚将我的机器更新到 Mountain Lion 10 8 1 并尝试安装 vim latex 我已经每天使用该套件大约 5 年了 但是当尝试进行全新安装并打开 tex 文件时 我收到以下错误消息 UnitCircleAnalysis t
  • 提取模式后的值

    一个初学者的问题 我有一个这样的列表 x lt c aa v12 bb x21 cc f35 xx r53 bb g 25 yy h48 nn u75 bb 26 gg m98 但还有更多行 我需要提取 bb 和 之间的内容 IE 我想 x
  • 父类可以调用子类方法吗?

    参考here https stackoverflow com questions 1385895 accesing a function via string stored in hashtable A是预编译的Java类 我也有源文件 B
  • OSMDroid 从资产文件夹加载自定义离线图块

    我想知道是否可以做这样的事情 我知道需要修改一些现有代码才能实现这一目标 但我想知道是否有人知道在哪里查看以及如何执行此操作 我在地图上的特定区域放置了一些自定义图块 作为 OSM 图块提供程序的替代品 但需要将它们存储在 assets 文
  • 将 JSON 转换为 Python 对象:如何处理 DateTime 转换?

    我有一个 C 控制台应用程序 可将 POCO 类序列化为 JSON 字符串 我使用 JSON Net 进行序列化 此应用程序中的 JSON 被转储到文件中 并由 Python 2 7 脚本读入 问题就在这里 JSON 序列化获取我的类上的所
  • 如何使用curl和PHP设置自定义请求标头键?

    我使用curl 和php 上传文件 我需要帮助来设置自定义请求标头键 例如 X Filename blahblah zip X Filesize 2677 X Filetype application zip 您必须使用curl setop
  • 如何修改 OpenXML TableCell 的前景色和背景色?

    我正在创建表格单元格 如下所示 private static TableCell GetHeaderCell string cellText var tc new TableCell new Paragraph new Run new Te
  • 如何将对象排序到存储桶中表示为有效的 JPQL 表达式?

    我想显示一个 2D 图表 其中包含给定时间跨度内处理的对象数量 映射在 JPA 中 在 30 分钟的时间内 这个数量可以扩展到大约 30k 个对象 作为一名 DBMS 我在 4 2 21 版中使用 PostgreSQL 9 4 和 JPA
  • 为什么我不需要在 C++20 中的依赖类型之前指定“typename”?

    这段代码在 C 20 中编译 使用 gcc 10 1 没有使用typename依赖类型之前的关键字std vector
  • Docker - eclipse-mosquitto:2.0.7 错误:地址不可用

    我正在尝试在 Windows 10 中将 mosquitto 作为 docker 容器运行 下面出现错误日志地址不可用 1614449526 mosquitto version 2 0 7 starting 1614449526 Confi
  • Firefox 开发者版缺少添加监视功能

    更新到 52 0a2 后 我无法在 javascript 调试器中创建自己的表达式 添加监视等 当我右键单击某个变量时 我过去只是从上下文菜单中选择 添加文本到监视表达式 但在最新版本中它丢失了 我必须启用某些功能吗 thanks The
  • 创建一个倒计时器,每 5 秒打印一次列表中每个值的剩余时间

    我正在尝试在 Flutter 中创建一个倒计时器来打印剩余时间每 5 秒直到计时器用完 然后为值列表中的下一个值运行相同的倒计时器 下面的递归函数接近 但它在转到下一个值之前等待 迭代 List即使剩下的时间越来越少Timer import