flutter學習之資料跨層傳遞方案
阿新 • • 發佈:2021-02-02
技術標籤:Flutter知識梳理
一、InheritedWidget
是flutter中一個功能型widget,適用於widget樹中共享資料場景,可以高效將資料在widget中進行跨層傳遞,例如主題風格Theme。在子wideget中通過theme.of方法 找到上層theme的widget,獲得到其屬性的同時,建立子widget和上層父wideget的觀察者關係,當上層wideget屬性改變的時候,子widget也會觸發更新。 不過InheritedWidget僅提供資料讀的能力,如果想修改資料,則需要把它和statefulWidget的state配套使用。
二、Notification
資料流動方式從子widget向上傳遞到父widget,這樣適用於子widget狀態變更,傳送通知上報場景。自定義通知的監聽首先需要繼承Notification類,Notification提供了dispatch方法,可以沿著context對應Element節點樹向上逐層傳送通知。
三、EventBus
InheritedWidget和Notification都依賴widget樹,標誌著只有父子關係widget之間進行資料共享,在元件之間沒有父子關係場景的時候就需要EventBus了。EventBus是一個三方外掛,類似於IOS中的NSNotificationCenter機制。
class CustomEvent { String msg; CustomEvent(this.msg); } //建立公共的event bus EventBus eventBus = new EventBus(); //第一個頁面 class _FirstScreenState extends State<FirstScreen> { String msg = "通知:"; StreamSubscription subscription; @override initState() { //監聽CustomEvent事件,重新整理UI subscription = eventBus.on<CustomEvent>().listen((event) { setState(() {msg+= event.msg;});//更新msg }); super.initState(); } dispose() { subscription.cancel();//State銷燬時,清理註冊 super.dispose(); } @override Widget build(BuildContext context) { return new Scaffold( body:Text(msg), ... ); } }
發起eventbus
class SecondScreen extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( ... body: RaisedButton( child: Text('Fire Event'), // 觸發CustomEvent事件 onPressed: ()=> eventBus.fire(CustomEvent("hello")) ), ); } }
四、總結: