【问题标题】:How to handle onPause/onResume in Flutter App?如何在 Flutter App 中处理 onPause/onResume?
【发布时间】:2018-04-25 07:22:59
【问题描述】:

我是 Dart/Flutter 的新手,想构建一个简单的应用程序,其中 LinearProgressBar 每秒更新一次。

无需过多了解实际代码,我就可以进行以下设置。

  • 根据经过的时间计算进度的函数。
  • 显示进度的 LinearProgressBar。
  • 周期性计时器重新计算进度并每秒更新进度条。
  • 我每次都调试打印'tick',重新计算完成。

一切都按预期工作,但有一个例外。当我在我的 Android 设备的后台移动应用程序时,会不断打印“勾号”。

在原生 Android 上,我会在触发“onPause”事件时取消我的定期计时器。

Flutter 中有类似的东西吗?我能找到的只有“initState”和“dispose”。但是,将应用移至后台时不会调用 Dispose。

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

在我的研究中,我发现了这个 Stack Overflow 问题 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 事件?

【问题讨论】:

    标签: android timer dart flutter ticker


    【解决方案1】:

    您可以覆盖WidgetBindingObserver 接口的didChangeAppLifecycleState 以接收应用生命周期更改的通知。

    this page中有示例代码

    【讨论】:

    【解决方案2】:

    您可以使用来自SystemChannelslifecycle 频道。

    例子:

    SystemChannels.lifecycle.setMessageHandler((msg){
      debugPrint('SystemChannels> $msg');
    });
    

    输出:

    I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
    I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed
    

    【讨论】:

    • 我觉得 amirs 解决方案更符合规范。不过感谢您的回答!
    • 这对其他人来说可能很明显,但我花了一段时间才弄清楚我需要在 Flutter runApp 调用之后将其移动到某个位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多