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('取消')),
],
),
],
),
),
);
}
}
flutter之stream
?著作權(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ù)。
【社區(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)容
- 單一偵聽和多重偵聽 使用StreamController ()只能設(shè)置一個(gè)偵聽函數(shù)StreamController...
- 作為系列文章的第十一篇,本篇將非常全面帶你了解 Flutter 中最關(guān)鍵的設(shè)計(jì)之一,深入原理幫助你理解 Strea...
- 1.前言 在Dart庫中,有兩種實(shí)現(xiàn)異步編程的方式(Future和Stream),使用它們只需要在代碼中引入dar...
- Eg:將Stream集合中的語句進(jìn)行單詞拆分,然后去重Stream testStream= Stream.of("...
- 老太太橫眤外孫一眼,看他往外走,又想起一事兒,問:“晚上咋安排姑娘睡啊?客房還是你那房間?” 霍安澤當(dāng)時(shí)也不知在想...