網(wǎng)站首頁 編程語言 正文
在Flutter中,常見的數(shù)據(jù)傳遞一共有以下幾種:
1、構(gòu)造方法傳遞
Flutter
的構(gòu)造方法具備著dart
語言的特點,參數(shù)具備可選狀態(tài),通過構(gòu)造方法傳遞數(shù)據(jù),可以很方便的將任意數(shù)據(jù)進(jìn)行傳遞,平時開發(fā)中,A
跳轉(zhuǎn)B
頁面最常用的方法就是通過構(gòu)造方法進(jìn)行傳遞。比如我們最常見的Key
就是通過構(gòu)造一級一級向下傳遞的。
優(yōu)點: 相鄰頁面之間傳遞數(shù)據(jù)非常方便,你不需要進(jìn)行任何額外的操作。
缺點: 當(dāng)頁面層級過多以及類過多時,需一級一級傳遞,寫起來非常麻煩,代碼耦合性高。
2、InheritedWidget
為了解決構(gòu)造函數(shù)一級一級鄉(xiāng)下傳遞的的缺點,F(xiàn)lutter派生出了功能性組件InheritedWidget
,通過它可以實現(xiàn)頂級widget的數(shù)據(jù)共享,也就是說無需一級一級向下傳遞,即可獲取數(shù)據(jù),比如A頁面有一個數(shù)據(jù),需要在C頁面使用,那么就可以不經(jīng)過B頁面獲取,前提ABC三個頁面是屬于一個Widget中的,常見的 TabView布局頂層數(shù)據(jù)共享,適合復(fù)雜頁面頂層向下傳遞數(shù)據(jù),使用也很簡單。
示例代碼:
/// 數(shù)據(jù)共享 class TestData extends InheritedWidget { final Widget child; final String data; // 共享數(shù)據(jù) // 構(gòu)造 const TestData({ Key? key, required this.child, required this.data, }) : super(key: key, child: child); /// 定義一個靜態(tài)方法 獲取數(shù)據(jù) static String of(BuildContext context) { // return context.dependOnInheritedWidgetOfExactType<TestDataestData>()?.data??"數(shù)據(jù)有誤"; return (context.getElementForInheritedWidgetOfExactType<TestData>()?.widget as TestData).data ; } @override bool updateShouldNotify(covariant TestData oldWidget) { return child != oldWidget.child; } }
然后在A頁面的根布局套上TestData
,在C頁面通過of
方法即可獲取數(shù)據(jù)。
兩種更新數(shù)據(jù)方法:
dependOnInheritedWidgetOfExactType
: 子組件更新didChangeDependencies();
getElementForInheritedWidgetOfExactType
: 不更新。
需要注意的點: 這種傳遞方式是樹狀結(jié)構(gòu)從上而下進(jìn)行傳遞,所共享數(shù)據(jù)的頁面必須在頂層的build
方法中,并且沒有延遲加載,比如這個頁面為動態(tài)加載,那么在C頁面中的initState
獲取數(shù)據(jù)就會報錯,原因就是首次構(gòu)建時,沒有加載子頁面導(dǎo)致,可在build方法中獲取,或者延時獲取。
優(yōu)點: 自上而下,無需一級一級傳遞,傳遞方便。
缺點: 不能跨組件傳遞。
應(yīng)用場景: 系統(tǒng)中比如我們常見的MediaQuery
設(shè)備信息和Theme
應(yīng)用主題就是通過這種方式在來進(jìn)行統(tǒng)一數(shù)據(jù)共享的。
3、Notification
Notification
是FLutter中的一種通知機制,和 InheritedWidget
相反,他可以自下而上通知父組件更新數(shù)據(jù),
定義傳遞數(shù)據(jù)類:
class TestDataN extends Notification{ final String data; TestDataN(this.data); }
子組件通知調(diào)用dispacth方法通知父組件。
TestDataN("data").dispatch(context);
在父組件進(jìn)行監(jiān)聽:
NotificationListener( onNotification: (data){ print("data$data"); return true; },child: child);
應(yīng)用場景: 比如我們的ListView
滾動監(jiān)聽、就是通過Notification
實現(xiàn)的。
4、Stream & event_bus
以上的2、3數(shù)據(jù)傳遞方式都是基于同一個widget樹進(jìn)行傳遞的,跨組件通信我們可以使用Stream事件流進(jìn)行傳遞,通過訂閱者模式監(jiān)聽數(shù)據(jù),可以在任意組件中進(jìn)行數(shù)據(jù)傳遞,event_bus插件就是使用這種方式來進(jìn)行數(shù)據(jù)傳遞的。
eventBus示例代碼:
// 創(chuàng)建公用對象 EventBus eventBus = EventBus(); // 監(jiān)聽數(shù)據(jù) eventBus.on().listen((event) { }); // 發(fā)送 eventBus.fire(event);
使用完畢在注冊接收數(shù)據(jù)頁面記得銷毀:eventBus.destroy();
優(yōu)點: 可以跨組件通信。
原文鏈接:https://juejin.cn/post/7113130538491183135
相關(guān)推薦
- 2022-09-15 python基于tkinter圖形化編程實現(xiàn)簡易計算器功能_python
- 2022-06-17 C語言詳解函數(shù)與指針的使用_C 語言
- 2022-09-25 navicat連接遠(yuǎn)程服務(wù)器報錯代碼:10038
- 2023-04-20 navicat 連接 mongodb 報錯[13][Unauthorized] command li
- 2023-05-30 python中pip無法正確安裝或路徑出錯的解決方案_python
- 2023-02-17 C++中二叉堆排序詳解_C 語言
- 2022-11-16 解決Oracle模擬事務(wù)提交、表鎖,處理表鎖問題_oracle
- 2023-04-12 如何將python代碼打包成pip包(可以pip?install)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支