<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在flutter專案中,頁面內直接呼叫setState方法會使得頁面重新執行build方法,導致內部元件被全量重新整理,造成不必要的效能消耗。出於效能和使用者體驗方面的考慮我們經常會使用區域性重新整理代替全量重新整理進行頁面更新的操作。包括Provider、ValueNotifier和StatefulBuilder等在內的技術方案,都能夠幫助我們實現Flutter區域性重新整理的需求。
本文記錄的是通過StreamBuilder來實現區域性重新整理的方法。
StreamBuilder元件的原始碼如下,其中包含了四個引數:
const StreamBuilder({ Key? key, this.initialData, Stream<t>? stream, required this.builder, }) : assert(builder != null), super(key: key, stream: stream); </t>
key : 元件的鍵值
initialData : 初始值資料,用於確保第一幀有可用資料顯示,否則將使用 null 值構建第一幀
stream : 用於監聽自己建立的資料流
builder : 必傳引數,返回一個小部件用於頁面構建
其中builder 包含了兩個引數,一個頁面的context,另一個是當前快照資訊:
typedef AsyncWidgetBuilder<t> = Widget Function(BuildContext context, AsyncSnapshot<t> snapshot); final AsyncWidgetBuilder<t> builder;
StreamBuilder元件在實際應用中主要分成以下操作:
1、宣告一個StreamController型別的控制器;
2、將需要區域性重新整理資料的元件巢狀在StreamBuilder元件內,接收資訊;
3、往StreamBuilder裡新增資料,並通知StreamBuilder重新構建;
4、關流,避免記憶體漏失
int a = 0; // 1、宣告一個StreamController型別的控制器,命名為streamController; final StreamController<int> streamController = StreamController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // 2、將需要區域性重新整理資料的元件巢狀在StreamBuilder元件內,並接收資訊; StreamBuilder<int>( stream: streamController.stream, initialData: a, builder: (BuildContext context, AsyncSnapshot<int> snapshot) { return Text('a : $a'); }, ), ElevatedButton( onPressed: () { a++; setState(() {}); }, child: Text('setState'), ), ElevatedButton( onPressed: () { a++; // 3、往`StreamBuilder`裡新增資料,並通知`StreamBuilder`重新構建; streamController.add(a); }, child: Text('streamBuilder'), ), ], ), ), ); } @override void dispose() { // TODO: implement dispose super.dispose(); // 4、關流,避免記憶體漏失 streamController.close(); }
點選第一個ElevatedButton按鈕後,頁面執行setState(() {})方法,通過系統的Flutter Performance工具我們可以捕獲到元件重新整理的情況如下,整個頁面被重新構建,這種情況下效能消耗較大。
點選第二個ElevatedButton按鈕後,頁面執行streamController.add(a)方法,通過系統的Flutter Performance工具我們可以捕獲到元件重新整理的情況如下,只有StreamBuilder元件及其內部元件被重新構建,實現了區域性重新整理的功能,有效的提高了頁面的效能。
為了避免State.setState方法重新構建全域性造成的效能消耗,我們可以通過StreamBuilder元件對頁面進行區域性重新整理。
以上就是Flutter StreamBuilder實現區域性重新整理範例詳解的詳細內容,
到此這篇關於Flutter StreamBuilder元件實現區域性重新整理範例講解的文章就介紹到這了,更多相關Flutter StreamBuilder內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45