Stream 并不是 Flutter 專屬庫,而是 Dart 的庫梯醒,和 Future 一樣都是非常重要的異步編程方式宽堆, RxDart、BloC茸习、flutter_bloc 都是基于 Stream 開發(fā)畜隶。Stream 的思想是基于管道(pipe)和 生產(chǎn)者消費(fèi)者模式。
案例一:通過 Stream 實(shí)現(xiàn)每秒鐘局部更新數(shù)據(jù)
通常我們在開發(fā) Flutter 頁面逮光,數(shù)據(jù)發(fā)生更新代箭,都是直接通過 setState 方式對整個頁面進(jìn)行更新。如果頁面某些數(shù)據(jù)需要每秒都更新涕刚,對整個頁面都刷新是很影響頁面性能,有必要局部刷新乙帮。
以下案例杜漠,實(shí)現(xiàn)每秒鐘顯示當(dāng)前的時間,甚至連 StatefulWidget 都沒有使用就可以實(shí)現(xiàn)數(shù)據(jù)更新察净。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: StreamDemo(),
);
}
}
class StreamDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('StreamDemo')),
body: Center(
child: StreamBuilder<String>(
initialData: "",
stream: Stream.periodic(Duration(seconds: 1), (value) {
return DateTime.now().toIso8601String();
}),
builder: (context, AsyncSnapshot<String> snapshot) {
return Text(
'${snapshot.data}',
style: TextStyle(fontSize: 24.0),
);
}),
),
);
}
}
案例二:通過按鈕點(diǎn)擊實(shí)現(xiàn)局部更新
class StreamDemo2 extends StatefulWidget {
@override
_StreamDemo2State createState() => _StreamDemo2State();
}
class _StreamDemo2State extends State<StreamDemo2> {
StreamController<int> _streamController;
var _counter = 0;
@override
void initState() {
_streamController = StreamController<int>();
super.initState();
}
@override
void dispose() {
_streamController.close();
super.dispose();
}
Stream<int> counter() {
return _streamController.stream;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('StreamDemo2')),
body: Center(
child: StreamBuilder<int>(
initialData: 0,
stream: counter(),
builder: (context, AsyncSnapshot<int> snapshot) {
return Text(
'${snapshot.data}',
style: TextStyle(fontSize: 24.0),
);
}),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
_streamController.add(++_counter);
},
),
);
}
}
雖然 Stream 可以實(shí)現(xiàn)數(shù)據(jù)局部的刷新驾茴,但是 Stream 屬于比較底層的類,如果要實(shí)現(xiàn)非常復(fù)雜的頁面開發(fā)并實(shí)現(xiàn)邏輯分離氢卡,還是建議使用 BloC 锈至,封裝比較完善,降低開發(fā)成本译秦。