首页 > 解决方案 > 在 AppLifecycleStates 之间颤动应用程序转换时流的行为如何?

问题描述

当一个 Flutter 应用转换到 时inactivedetached或者paused它可能有活跃的流订阅。当应用在这些状态之间移动时,这些订阅会发生什么情况?在转换到特定状态时,我应该注意取消/重新启动订阅吗?

标签: flutterdartstreamlifecycle

解决方案


这取决于您是否想暂停一段Stream时间您的应用程序是inactive还是paused

更改 ApplifeCycle 状态不会在更改状态时暂停流订阅,并且仅在关闭应用程序时取消订阅,如果您在dispose()方法中提及它。

您可以尝试此代码来测试行为:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  StreamSubscription sub;

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print(state);
    print('Paused: ${sub.isPaused}');

    // Here you can cancel or pause subscriptions if necessary
    if (state == AppLifecycleState.paused) {
      sub.pause();
    }

  }

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    sub = Stream.periodic(const Duration(seconds: 1))
        .listen(print);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    sub.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return const SizedBox();
  }
}

推荐阅读