ui頁面是經常要改內容的 但是如果用setState方法去刷新 每次都會重新 Build構造一遍 會造成app卡頓 資源占用高,所以可以使用StreamBuild 去訂閱 刷新需要刷新的那個UI部件 就不用重構一遍整個頁面,除了StreamBuild以外 還有很多種方式 如谷歌的親兒子Provider ,以及第三方的Bloc ,個人覺得 bloc 使用起來比較復雜,本人喜歡StreamBuild這一種,當然 bloc 也是可以和StreamBuild組合使用的,但是小項目沒有必要 比較適合大型項目進行狀態的管理
import 'dart:async';
import 'package:flutter/material.dart';
class StreamBuilderPage extends StatefulWidget {
@override
__StreamBuilderPageState createState() => _StreamBuilderPageState();
}
class _StreamBuilderPageState extends State<StreamBuilderPage> {
String _str = "我會變哦";
//步驟1:初始化一個StreamController<可以是 int string... 一般是model>
final StreamController<String> _streamController = StreamController<String>();
@override
void dispose(){
//步驟2.關流,不管流會消耗資源,同時會引起內存泄漏
_streamController.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Stream version of the ——str App')),
body: Center(
//步驟3.使用StreamBuilder構造器
child: StreamBuilder<String>( // 監聽Stream,每次值改變的時候,更新Text中的內容
stream: _streamController.stream,
initialData: _str,
builder: (BuildContext context, AsyncSnapshot<int> snapshot){
return Text('點擊的時候這個值會改變: ${snapshot.data}');
}
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: (){
// 點擊按鈕,更改_str 的值,同時通過Sink將它發送給Stream;
// 注入一個值時,會引起StreamBuilder的監聽,StreamBuilder重建並刷新_str
//步驟4.往StreamBuilder里添加流,數據變了,就用通知小部件
_str = "喝喝喝";
_streamController.sink.add(_str);
},
),
);
}
}
另外 需要了解Stream的更多使用方法 可以參考這位博主的博客 https://www.jianshu.com/p/846abf65cd9b
