1. 程式人生 > 其它 >flutter學習之資料跨層傳遞方案

flutter學習之資料跨層傳遞方案

技術標籤: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"))
      ),
    );
  }
}

四、總結:

參考文章