網(wǎng)站首頁 編程語言 正文
正文
如果我想要做一個組件,每秒更新時間, 最開始的想法就是使用StatefulWidget, 然后每秒調用一下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的拓展,為了內部使用上面寫的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的地方 調用present()就能很簡單的使用,可以傳入你想要調用的任何方法的回調。
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), ), ), ); } }
大功告成,下面看一下結果
原文鏈接:https://juejin.cn/post/7174637935168323644
相關推薦
- 2022-06-26 Android?app啟動節(jié)點與上報啟動實例詳解_Android
- 2022-10-02 Python實現(xiàn)遍歷讀取文件或文件夾_python
- 2022-07-08 Python如何通過地址獲取變量_python
- 2022-08-06 python實現(xiàn)去除空格及tab換行符的方法_python
- 2022-11-16 Python中使用__hash__和__eq__方法的問題_python
- 2022-07-01 Go官方限流器的用法詳解_Golang
- 2022-05-25 詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題_C 語言
- 2024-03-15 Spring Framework對DAO(Data Access Object)的支持
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支