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)聽這個stream壹将,提供了幾個事件的處理方法,比如有數(shù)據(jù)的時候屯曹,發(fā)生錯誤的時候恶耽,完成的時候
// listen的返回值是StreamSubscription類型颜启,使用它可以暫停、恢復缰盏、取消監(jiān)聽
// _streamDemoSubscription = _streamDemo.listen(onData, onError: onError, onDone: onDone);
// 使用streamController監(jiān)聽
// 使用StreamBuilder時口猜,這里就不需要監(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('恢復監(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)一個字符串
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ù)去構建小部件济炎,stream上的數(shù)據(jù)發(fā)生變化后會重新構建小部件
StreamBuilder(
stream: _streamDemo.stream,
initialData: '...', // 設置初始值
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('取消')),
],
),
],
),
),
);
}
}
flutter之stream
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門梗摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想许,“玉大人,你說我怎么就攤上這事糜烹∈” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵愕乎,是天一觀的道長感论。 經常有香客問我贮尖,道長,這世上最難降的妖魔是什么湿硝? 我笑而不...
- 正文 為了忘掉前任关斜,我火速辦了婚禮痢畜,結果婚禮上,老公的妹妹穿的比我還像新娘丁稀。我一直安慰自己,他們只是感情好凿可,可當我...
- 文/花漫 我一把揭開白布授账。 她就那樣靜靜地躺著,像睡著了一般敛助。 火紅的嫁衣襯著肌膚如雪纳击。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磷醋!你這毒婦竟也來了胡诗?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布孩锡,位于F島的核電站,受9級特大地震影響忧吟,放射性物質發(fā)生泄漏斩披。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厕倍。 院中可真熱鬧,春花似錦况既、人聲如沸组民。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽耸三。三九已至乱陡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仪壮,已是汗流浹背憨颠。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 單一偵聽和多重偵聽 使用StreamController ()只能設置一個偵聽函數(shù)StreamController...
- 作為系列文章的第十一篇,本篇將非常全面帶你了解 Flutter 中最關鍵的設計之一蝶缀,深入原理幫助你理解 Strea...
- 1.前言 在Dart庫中丹喻,有兩種實現(xiàn)異步編程的方式(Future和Stream),使用它們只需要在代碼中引入dar...
- Eg:將Stream集合中的語句進行單詞拆分柄慰,然后去重Stream testStream= Stream.of("...
- 老太太橫眤外孫一眼敬矩,看他往外走弧岳,又想起一事兒禽炬,問:“晚上咋安排姑娘睡啊?客房還是你那房間?” 霍安澤當時也不知在想...