我想三行共享一个流,并且每一行都可以暂停和恢复。
现在,我只能使用StreamController
和StreamBuilder
将一个流共享到三行,但是我不知道如何暂停和恢复。
https://github.com/WingCH/Fluuter-Exercise
...
class StreamDemoState extends State<StreamDemo> {
StreamController _streamController;
Stream<int> timerStream;
@override
void initState() {
super.initState();
//Timer
Duration interval = Duration(seconds: 1);
timerStream = Stream.periodic(interval, (data) {
return data;
});
_streamController = StreamController.broadcast();
_streamController.addStream(timerStream);
}
Widget build(BuildContext context) {
...
Padding(
padding: EdgeInsets.all(10),
child: StreamBuilder<Object>(
stream: _streamController.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(
children: <Widget>[
Text(
snapshot.data.toString(),
style: TextStyle(
color: Colors.blueGrey,
fontWeight: FontWeight.bold,
fontSize: 80),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
OutlineButton(
onPressed: () {
//listen / resume
},
child: Text('listen'),
),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20.0),
child: OutlineButton(
onPressed: () {
//Pause
},
child: Text('Paused'),
),
),
OutlineButton(
onPressed: null,
child: Text('--'),
),
],
)
],
);
} else {
return Text('no Date');
}
}),
),
...
}
答案 0 :(得分:0)
我面临着同样的问题,这就是我想出的: 除了在StreamController上调用addStream之外,您还可以在timerStream上使用侦听器一一添加事件。 listen返回一个StreamSubscription,您可以使用SubscriberSubsription.pause暂停intStream。
将_streamController.addStream(timerStream);
替换为以下内容(我自己没有运行过,因此可能会有一些错字):
var _timerSubscription = timerStream.listen((event) => _streamController.add(event));
现在您可以分别用以下内容替换//resume
和//pause
:
//resume
_timerSubscription.resume();
//pause
_timerSubcription.pause();
请注意,在多次调用pause()
的情况下暂停的流将需要对resume()
进行相同数量的调用才能取消暂停-如果这是不受欢迎的行为,您可以禁用暂停按钮(或者只是禁用如果流已经暂停,则跳过对onPressed中的pause()的调用。
此外,当它们不再使用时,请不要忘记取消StreamSubscription并关闭StreamController!