網站首頁 編程語言 正文
正文
如果我想要做一個組件,每秒更新時間, 最開始的想法就是使用StatefulWidget, 然后每秒調用一下setState方法刷新數據
能不能換成使用StatelessWidget呢? 可以的,不過用Stream來實現。
先創建一個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狀態產生值,但是stream在active狀態下就已經持續產生值了
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();
}
}
}
}
創建一個stream,每秒產生一個值
Stream<String> getDataTime() => Stream.perioodic(
const Duration(seconds: 1),
(_) => DateTime.now().toIso8601string(),
);
創建Stream拓展
為了方便使用,我又創建了一個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
相關推薦
- 2023-02-05 不同的編程語言輸出?“Hello?World”?代碼_其它綜合
- 2022-07-11 Android?studio實現左右滑動切換圖片_Android
- 2022-08-04 基于python實現rpc遠程過程調用_python
- 2023-04-13 react 打包優化,配置生產環境不輸出console.log
- 2022-07-18 linux系統安全和應用
- 2022-12-15 Pytorch加載數據集的方式總結及補充_python
- 2022-04-22 Golang執行流程詳解,兩種執行流程方式有什么不同
- 2022-05-17 解析Go?中的?rune?類型_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支