flutter - 是否有一个订阅流,它不会引发异常。相反,它会自动取消旧订阅?
问题描述
标题几乎描述了一切。我发现自己经常这样做:
StreamSubscription willDismissPageStreamSubscription;
@override
void initState() {
willDismissPageStreamSubscription?.cancel();
willDismissPageStreamSubscription =
bloc.willDismissPageStream(widget.pageIndex).listen((willDismiss) {});
}
我在可以多次调用的方法中收听流。如果我不取消订阅,它会在每次调用 initState 时创建一个新订阅。我想知道是否有一个允许这样做的流,每次通过调用listen创建一个新的StreamSubscription时,旧的订阅就会被取消:
@override
void initState() {
bloc.willDismissPageStream(widget.pageIndex).listen((willDismiss) {});
}
编辑:我或多或少地搜索单订阅流,但它应该取消最后一个 StreamSubscription,而不是抛出异常。
编辑 2:如果这样的 Stream 不存在,我将如何创建它?
解决方案
通常,您不希望新订阅改变旧订阅。这使得 observables 难以推理。
这是一个串行模式,通常使用SerialDisposable来实现。原子调用set
会取消之前的订阅。
SerialDisposable serial = new SerialDisposable();
@override
void initState() {
serial.set(bloc.willDismissPageStream(widget.pageIndex).listen((willDismiss) {}));
}
如果你想在 Observable 中出现这种行为,你可以发送一个完成的通知而不是一个导致管道拆除的错误,但这不是我推荐的。
推荐阅读
- c# - 检查列表是否包含具有不同大小写的相同字符串
- javascript - 反应使用状态转换
- nearprotocol - NEAR SC 挑战 - 简单的 AS 错误“没有足够的非选项参数:得到 1,需要至少 2”(Powershell n VSCode)
- javascript - 如何在 JavaScript 中将类变量初始化为空数组?
- python - Matplotlib:使用 plt.show() 的分段错误
- javascript - Jest 未能等待 axios 承诺破坏测试
- python - 如何使用 Selenium CONTAINS 在 Python 中查找动态变化的按钮?
- load-testing - 了解 k6 如何在短时间内在底层管理大量 API 调用
- ansible - ansible 任务在 crontab 中失败
- c++ - 从用户输入的字符串中计算小写、大写和数字的数量