【问题标题】:StreamSubscription not resuming when the app comes back to foreground当应用程序返回前台时,StreamSubscription 未恢复
【发布时间】:2021-01-14 14:19:21
【问题描述】:

我有一个流应该在屏幕上无休止地运行(它每 5 秒产生一个值)。它必须在应用程序进入后台时暂停,并在应用程序返回前台时恢复。问题是它在暂停后实际上并没有恢复。我的代码的相关部分如下:

class MyWidgetState extends State<MyWidget> with WidgetsBindingObserver{
  StreamSubscription _subscription;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await _initStreamAndSubscribe(); // inits a stream s and sets
                                       // _subscription = s.listen(...)  
    });
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState lifecycleState) {
    super.didChangeAppLifecycleState(lifecycleState);
    if (lifecycleState != AppLifecycleState.resumed) {
      _subscription?.pause();
    } else {
      _subscription?.resume();
    }
  }

  @override
  void dispose() {
    super.dispose();
    _subscription?.dispose();
    WidgetsBinding.instance.removeObserver(this);
  }
}  

这里有什么问题吗?或者问题可能出在我的代码的其他部分?

编辑 1

我想补充一点,我在同一个班级的其他地方打电话给_subscription?.pause()_subscription?.resume(),即当我需要去另一个屏幕然后回来时。在这种情况下,流恢复没有问题。

【问题讨论】:

    标签: flutter dart stream


    【解决方案1】:

    我注意到_subscription?.pause()_subscription?.resume() 总是分别被调用两次。我敢打赌,如果一个人暂停流两次,恢复它两次实际上并没有恢复它。无论如何,我将_subscription?.pause() 替换为

    if (!(_subscriptiton?.isPaused ?? true)) {
      _subscriptiton?.pause();
    }
    

    避免两次暂停。它奏效了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2011-10-05
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多