flutter之stream

class StreamDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('StreamDemo'), elevation: 0.0,),
      body: StreamDemoHome(),
    );
  }
}

class StreamDemoHome extends StatefulWidget {
  @override
  _StreamDemoHomeState createState() => _StreamDemoHomeState();
}

class _StreamDemoHomeState extends State<StreamDemoHome> {
  StreamSubscription _streamDemoSubscription;
  // StreamController可以控制、管理stream
  StreamController<String> _streamDemo;
  StreamSink _sinkDemo;

  @override
  void dispose() {
    _streamDemo.close();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();

    print('Create a stream.');
    // 創(chuàng)建stream
//    Stream<String> _streamDemo = Stream.fromFuture(fetchData());
    _streamDemo = StreamController<String>();
    _sinkDemo = _streamDemo.sink;

    print('Start listening on a stream');
    // 使用stream上的數(shù)據(jù)需要監(jiān)聽這個(gè)stream,提供了幾個(gè)事件的處理方法,比如有數(shù)據(jù)的時(shí)候,發(fā)生錯(cuò)誤的時(shí)候,完成的時(shí)候
    // listen的返回值是StreamSubscription類型,使用它可以暫停、恢復(fù)、取消監(jiān)聽
//    _streamDemoSubscription = _streamDemo.listen(onData, onError: onError, onDone: onDone);
    // 使用streamController監(jiān)聽
    // 使用StreamBuilder時(shí),這里就不需要監(jiān)聽了
//    _streamDemoSubscription = _streamDemo.stream.listen(onData, onError: onError, onDone: onDone);

    print('Initialize completed.');
  }

  void onData(String data) {
    print('$data');
  }

  void onError(error) {
    print('Error: $error');
  }

  void onDone() {
    print('Done');
  }

  void _pauseStream() {
    print('停止監(jiān)聽');
    _streamDemoSubscription.pause();
  }

  void _resumeStream() {
    print('恢復(fù)監(jiān)聽');
    _streamDemoSubscription.resume();
  }

  void _cancelStream() {
    print('取消監(jiān)聽');
    _streamDemoSubscription.cancel();
  }

  void _addDataToStream() async {
    print('給stream添加數(shù)據(jù)');

    String data = await fetchData();
//    _streamDemo.add(data);
    // 使用sink給stream添加數(shù)據(jù)
    _sinkDemo.add(data);
  }

  // 5秒后在stream上出現(xiàn)一個(gè)字符串
  Future<String> fetchData() async {
    await Future.delayed(Duration(seconds: 5));
    return 'Hello World!';
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用StreamBuilder可以根據(jù)stream上的數(shù)據(jù)去構(gòu)建小部件,stream上的數(shù)據(jù)發(fā)生變化后會(huì)重新構(gòu)建小部件
            StreamBuilder(
              stream: _streamDemo.stream,
              initialData: '...', // 設(shè)置初始值
              builder: (context, snapshot) {
                return Text('${snapshot.data}');
              },
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                FlatButton(onPressed: _addDataToStream, child: Text('添加')),
                FlatButton(onPressed: _pauseStream, child: Text('停止')),
                FlatButton(onPressed: _resumeStream, child: Text('繼續(xù)')),
                FlatButton(onPressed: _cancelStream, child: Text('取消')),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容