如何在Streambuilder中控制流(启动,暂停,恢复)

时间:2020-01-05 04:54:29

标签: flutter dart

我想三行共享一个流,并且每一行都可以暂停和恢复。

现在,我只能使用StreamControllerStreamBuilder将一个流共享到三行,但是我不知道如何暂停和恢复。

enter image description here

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');
                  }
                }),
          ),
...
  }

1 个答案:

答案 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!