flutter - 在 AppLifecycleStates 之间颤动应用程序转换时流的行为如何?
问题描述
当一个 Flutter 应用转换到 时inactive
,detached
或者paused
它可能有活跃的流订阅。当应用在这些状态之间移动时,这些订阅会发生什么情况?在转换到特定状态时,我应该注意取消/重新启动订阅吗?
解决方案
这取决于您是否想暂停一段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();
}
}
推荐阅读
- javascript - 在 React 中渲染子后设置父状态
- python - 头肩交易策略
- javascript - Mobx 类无法读取未定义的属性“正在加载”
- javascript - 在 Vue 中以编程方式更改自动完成所选项目
- python-3.x - 为什么第二次迭代总是失败?
- amazon-web-services - AWS:Lambda:以编程方式添加 SNS 触发器
- bluetooth - 在 macOS Catalina 中更改蓝牙设备(魔术鼠标)的名称?
- gmail-api - 删除电子邮件服务器添加的“[External]”标签
- c# - TransactionScope 不会在每次测试 TearDown 中回滚以使用 NUnit 和 TestServer 进行集成测试
- swift - 说你的函数永远不应该内联有什么好处?