流侦听器的执行顺序



在执行顺序很重要的情况下,有没有一种方法可以强制执行具有多个侦听器的广播流的执行顺序?

StreamSubscription<T> listen(void onData(T event)?,
{Function? onError, void onDone()?, bool? cancelOnError});

抽象定义似乎不支持它。我正在寻找一个类似"priority"参数的东西来指定操作顺序。

例如,现在我有一个UserController,当用户发生更改时,它会通知侦听器执行某些操作。然而,一些听众需要被优先考虑,但他们需要在自己的单独班级中。示例代码:

class UserController{
Stream user;
}
class IndependentControllerA {
//...
userController.user.listen((){
// This needs to be carried out first before everything else
}
//...
}
class IndependentControllerB {
userController.user.listen((){
// This needs to be carried out before A
}
}

我想克服这一点的是,UserController注册一个可以按顺序等待的自己的Future回调列表。参见示例:

class UserController {
List<Future Function()> callbacks;

void changeUser() async {
callbacks.forEach((callback) => await callback());
}
}
class IndependentControllerA {
//...
userController.callbacks.add(() => print('Do first thing'));
//...
}
class IndependentControllerB {
//...
userController.callbacks.add(() => print('Do second thing'));
//...
}

然而,我觉得这不是很优雅,如果有更好的天生方式来做到这一点的话。有吗?

Dart绝对不会承诺通知监听器的顺序。在实践中,它可能会以某种方式进行排序,这取决于添加侦听器的顺序,但这并不能保证,而且它可能随时更改。(并不是真的,肯定有写得不好的代码,这取决于排序,如果排序发生变化,就会中断,但这只是意味着必须有一个好的理由来进行更改,而不是说它不可能发生(。

我会写我自己的";优先级确定器";如果我有这样的特殊需要。就像你在这里开始的一样。了解您的具体需求可能会比制定一个完全通用的解决方案简单得多。

最新更新