我有这个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();
但是我试图理解为什么它不能像我最初那样工作。
答案 0 :(得分:2)
它不是“一次一个”。非广播流只能收听一次。
目前,我认为使用广播流是您的最佳选择。广播流控制器在不再具有侦听器并再次开始具有侦听器时,确实会收到onCancel
和onListen
事件,因此您可以避免在没有侦听器的情况下进行工作。
令人烦恼的是,没有可以多次收听的流,但是它不是广播流。广播流将许多属性组合成一个概念,有时您需要仅包含其中一些属性的流(例如,多次收听,但不一定要向所有人发送相同的值)。
答案 1 :(得分:1)
尝试一些事情:
我认为第一个技巧将帮助您