Presenting?Streams?in?Flutter小技巧
正文
如果我想要做一個組件,每秒更新時間, 最開始的想法就是使用StatefulWidget, 然后每秒調(diào)用一下setState方法刷新數(shù)據(jù)
能不能換成使用StatelessWidget呢? 可以的,不過用Stream來實(shí)現(xiàn)。
先創(chuàng)建一個AsyncSnapshot的拓展
extends PresentAsyncSnapshot<E> on AsyncSnapshot<E> { Widget present({ required BuildContext context, Widget Function(BuildContext context)? onNone, Widget Function(BuildContext context, E data)? onData, Widget Function(BuildContext context, Object error, StackTrace stackTrace)? onError, Widget Function(BuildContext context)? onDoneWitNeitherDataNorError, Widget FUnction(BuildContext context)? onWaiting, }) { switch (connectionState) { case ConnectionState.none: return onNone?.call(context) ?? const SizedBox.shrink(); case ConnectionState.waiting: return onWaiting?.call(context) ?? const CircularProgressIndicator(); case ConnectionState.active: //future在done狀態(tài)產(chǎn)生值,但是stream在active狀態(tài)下就已經(jīng)持續(xù)產(chǎn)生值了 case ConnectionState.done: if (hasError) { return onError?.call(context, error!, stackTrace!) ?? const SizedBox.shrink(); } else if (hasData) { return onData?.call(context, data as E) ?? const SizedBox.shrink(); } else { reutrn onDoneWitNeitherDataNorError?.call(context) ?? const SizedBox.shrink(); } } } }
創(chuàng)建一個stream,每秒產(chǎn)生一個值
Stream<String> getDataTime() => Stream.perioodic( const Duration(seconds: 1), (_) => DateTime.now().toIso8601string(), );
創(chuàng)建Stream拓展
為了方便使用,我又創(chuàng)建了一個Stream的拓展,為了內(nèi)部使用上面寫的PresentAsyncSnapshot拓展
extension PresentStream<E> on Stream<E> { Widget present({ Widget Function(BuildContext context)? onNone, Widget Function(BuildContext context, E data)? onData, Widget Function(BuildContext context, Object error, E data)? onData, Widget Function(BuildContext context)? onDoneWitNeitherDataNorError, Widget Function(BuildContext context)? onWaiting. }) { return StreamBuilder<E>( stream: this, builder: (context, snapshot) => snapshot.present( context: context, onNone: onNone, onData: onData, onError: onError, onDoneWitNeitherDataNorError: onDoneWItNeitherDataNorError, onWaiting: onWaiting, ), ); } }
下面來測試一下,只需要在任何Stream的地方 調(diào)用present()就能很簡單的使用,可以傳入你想要調(diào)用的任何方法的回調(diào)。
class HomePage extends StatelessWidget { const HomePage({Key? key}): super(key: key); @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: getDateTime().present( onData: (_, dateTime) => Text(dateTime), ), ), ); } }
大功告成,下面看一下結(jié)果
以上就是Presenting Streams in Flutter的詳細(xì)內(nèi)容,更多關(guān)于Flutter Presenting Streams的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android開發(fā)No Focused Window ANR產(chǎn)生原理解析
這篇文章主要為大家介紹了Android開發(fā)No Focused Window ANR產(chǎn)生原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Android Animation之TranslateAnimation(平移動畫)
這篇文章主要為大家詳細(xì)介紹了Animation之TranslateAnimation平移動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Android編程使用LinearLayout和PullRefreshView實(shí)現(xiàn)上下翻頁功能的方法
這篇文章主要介紹了Android編程使用LinearLayout和PullRefreshView實(shí)現(xiàn)上下翻頁功能的方法,涉及Android界面布局與邏輯處理相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android開發(fā)-之監(jiān)聽button點(diǎn)擊事件的多種方法
本篇文章主要是介紹了Android開發(fā)之監(jiān)聽button點(diǎn)擊事件的方法,Android開發(fā)-之監(jiān)聽button點(diǎn)擊事件的方法總結(jié),有興趣的可以了解一下。2016-11-11詳解Flutter如何在單個屏幕上實(shí)現(xiàn)多個列表
這篇文章主要為大家詳細(xì)介紹了Flutter如何在單個屏幕上實(shí)現(xiàn)多個列表,這些列表可以水平排列、網(wǎng)格格式、垂直排列,甚至是這些常用布局的組合,感興趣的小伙伴可以了解下2023-11-11Android 獲取設(shè)備屏幕大小的幾種方法總結(jié)
這篇文章主要介紹了Android 獲取設(shè)備屏幕大小的幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-05-05Android利用CountDownTimer實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時效果實(shí)例
這篇文章主要給大家介紹了關(guān)于Android如何利用CountDownTimer實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10