Presenting?Streams?in?Flutter小技巧
正文
如果我想要做一個組件,每秒更新時間, 最開始的想法就是使用StatefulWidget, 然后每秒調(diào)用一下setState方法刷新數(shù)據(jù)
能不能換成使用StatelessWidget呢? 可以的,不過用Stream來實現(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的詳細內(nèi)容,更多關(guān)于Flutter Presenting Streams的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android常用三方庫混淆規(guī)則整理(小結(jié))
這篇文章主要介紹了Android常用三方庫混淆規(guī)則整理(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Android實現(xiàn)類似qq微信消息懸浮窗通知功能
這篇文章主要介紹了Android實現(xiàn)類似qq微信消息懸浮窗通知,需要的朋友可以參考下2018-02-02
Android獲取WebView加載url的請求錯誤碼 【推薦】
這篇文章主要介紹了Android獲取WebView加載url的請求錯誤碼 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
百度地圖API提示230 錯誤app scode碼校驗失敗的解決辦法
筆者近2天在 Android Studio上玩了一下百度地圖,碰到了常見的"230錯誤 APP Scode校驗失敗",下面我來介紹一下具體的解決辦法2016-01-01

