流可以一次收听一次还是一般一次收听一次?

时间:2019-02-10 19:56:46

标签: dart flutter bloc

我有这个StreamController:

StreamController<Workout> _selectedWorkoutSubject = new StreamController()

我像这样在StreamBuilder中收听它:

StreamBuilder(
  stream: workoutBloc.selectedWorkoutStream,
  builder: (BuildContext context, AsyncSnapshot<Workout> snapshot) {
    if (snapshot.hasData) {
      return ...
    } else {
      return Text('loading...');
    }
  }
);

当我离开当前页面并返回到该页面时,出现异常:Bad state: Stream has already been listened to.我一次只能知道一次,但这不是我在做什么吗?当我离开页面时,StreamBuilder应该会收集垃圾以释放流,以便其他人可以收听它。

或者一般只能对Stream收听一次(一次不能收听一次)?我知道我可以做到

StreamController<Workout> _selectedWorkoutSubject = new StreamController.broadcast();

但是我试图理解为什么它不能像我最初那样工作。

2 个答案:

答案 0 :(得分:2)

它不是“一次一个”。非广播流只能收听一次。

目前,我认为使用广播流是您的最佳选择。广播流控制器在不再具有侦听器并再次开始具有侦听器时,确实会收到onCancelonListen事件,因此您可以避免在没有侦听器的情况下进行工作。

令人烦恼的是,没有可以多次收听的流,但是它不是广播流。广播流将许多属性组合成一个概念,有时您需要仅包含其中一些属性的流(例如,多次收听,但不一定要向所有人发送相同的值)。

答案 1 :(得分:1)

尝试一些事情:

  1. 设置流构建器的初始数据
  2. 将StreamController更改为BehaviorSubject(RxDart库)

我认为第一个技巧将帮助您