我是DART/Ffltter的新手,我想构建一个简单的应用程序,其中LinearProgressBar每秒都会更新.

在不太深入实际代码的情况下,我可以使用以下设置.

  • 根据经过的时间计算进度的函数.
  • 显示进度的线性进度条.
  • 定期计时器,每秒重新计算进度并更新进度条.
  • 每次重新计算时,我都会调试打印"Tick".

除了一个例外,一切都按预期进行.当我在Android设备的后台移动应用程序时,"勾号"一直在打印.

在原生安卓系统上,当触发"onPause"事件时,我会取消定期计时器.

Flutter 克也有类似的东西吗?我能找到的只有‘initState’和‘dispose’.但是,在将应用程序移动到后台时,不会调用Dispose.

我不希望计时器在后台一直滴答作响.

在我的研究中,我发现了这个堆栈溢出问题onresume-and-onpause-for-widgets-on-flutter.答案是建议使用TickerProviderStateMixin.

我是这样用的.

class _BarItemState extends State<BarItem> with SingleTickerProviderStateMixin {
    Ticker ticker;
    num progress = 1.0;

    @override
    void initState() {
       super.initState();
       ticker = createTicker((duration) => setState(() {
          debugPrint('tick');
          progress = duration.inSeconds / 30;
       }))
      ..start();
    }

    // other stuff omitted

}

它正在发挥作用,但我仍然不满意.

原因是,现在每隔几毫秒就会调用一次ticker回调,而不是每秒调用一次.在我看来,这似乎是浪费资源(我不需要平滑的动画)...我是不是把事情搞得太复杂了?

即使我的用例看起来不需要它,我仍然想知道:

我自己怎么处理onPause/onResume事件?

推荐答案

您可以覆盖WidgetBindingObserver接口的didChangeAppLifecycleState以接收app lifecycle更改的通知.

this page中有示例代码

Flutter相关问答推荐

使用自定义控制器将项插入到ListView中时行为不正确

如何处理Flutter Riverpod异步通知器中的状态和数据库

在框中保存对象列表时,类型推断无法正常工作

当键盘在抖动中打开时,如何才能看到包装在SingleChildScrollView中的列中的最后一个小工具?

将Riverpods NotifierProvider与State类一起使用

从图标启动器打开时,VSCode未检测到Web设备

Flutter:如何在 Future 函数上添加网络判断和 showDialog

Flutter中pubspec.yaml文件中的name参数是什么?

如何使用Riverpod提供程序正确构建搜索栏?

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

使 Row 中的元素保持在中间的空间,如果它们太大,则将它们包裹起来

如何在 flutter 中同时使用 ButtonStyle() 和 ElevatedButton.styleFrom() ?

Flutter Serverpod 在示例项目上返回 400 错误

在 Flutter 中将提取的 Listview.builder 与两个列表一起使用

Flutter 中的无效日期格式 2022 年 11 月 14 日

Flutter Widget 测试:无法使用 find.byWidget() 找到小部件

我几乎每次都将 Stateless Widget 与 BLoC 一起使用.我错了吗?

Flutter:如何将列表转换为字符串?

使用 mocktail 包进行单元测试时,类型Null不是Future类型的子类型

如何在flutter中共享容器和gridview之间的滚动条?