最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Flutter中的數(shù)據(jù)傳遞

 更新時(shí)間:2021年04月06日 08:58:15   作者:移動(dòng)的小太陽  
這篇文章主要介紹了Flutter中的數(shù)據(jù)傳遞的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Flutter,感興趣的朋友可以了解下

Flutter 中的數(shù)據(jù)傳遞

在開發(fā)中,數(shù)據(jù)從一個(gè)頁面?zhèn)鬟f到另一個(gè)頁面事很常用的,在Android 開發(fā)中,通常是通過把數(shù)據(jù)放到 intent 中傳遞過去。在 Flutter 中,數(shù)據(jù)是如何傳遞的呢?

在Flutter 中一切都是Widget,所以數(shù)據(jù)的傳遞就成了數(shù)據(jù)才Widget 中的傳遞。在之前的學(xué)習(xí)中,數(shù)據(jù)從一個(gè)Widget 傳遞到 子 Widget 是通過構(gòu)造函數(shù),一層一層的往里面?zhèn)?,要?widget 的層級(jí)比較少,還沒什么問題,要是層級(jí)很多,這樣傳遞就太麻煩了。

還好Flutter 還提供了三種方案:InheritedWidget、Notification 和 EventBus來解決數(shù)據(jù)傳遞問題。

InheritedWidget

InheritedWidget 是 Flutter 中的一個(gè)功能型 Widget,適用于在 Widget 樹中共享數(shù)據(jù)的場景。通過它,我們可以高效地將數(shù)據(jù)在 Widget 樹中進(jìn)行跨層傳遞。

下面看計(jì)數(shù)器的例子:

// 1.InheritedWidget,我們定義了一個(gè)繼承自它的新類 CountContainer,里面存放需要共享的數(shù)據(jù)
//然后,我們將計(jì)數(shù)器狀態(tài) count 屬性放到 CountContainer 中,并提供了一個(gè) of 方法方便其子 Widget 在 Widget 樹中找到它。
//最后,我們重寫了 updateShouldNotify 方法,這個(gè)方法會(huì)在 Flutter 判斷 InheritedWidget 是否需要重建,
class CountContainer extends InheritedWidget {
 static CountContainer of(BuildContext context) =>
   context.dependOnInheritedWidgetOfExactType<CountContainer>();
 final _InheritedWidgetHomeState mode;
 final Function() function;

 CountContainer(
   {Key key,
   @required this.mode,
   @required this.function,
   @required Widget child})
   : super(key: key, child: child);

 @override
 bool updateShouldNotify(covariant InheritedWidget oldWidget) {
  return this != oldWidget;
 }
}



// 2. 通過構(gòu)建方法,把數(shù)據(jù)放到 InheritedWidget中
class _InheritedWidgetHomeState<InheritedWidgetHome> extends State {
 int count = 0;

 void _incrementCounter() => setState(() {
  count++;
 });

 @override
 Widget build(BuildContext context) {
  return CountContainer(
   mode: this,
   function: _incrementCounter,
   child: CountWidget(),
  );
 }
}

// 3. 在子 widget 通過 CountContainer.of方法,獲取到自定義的 InheritedWidget,并從中取得共享的數(shù)據(jù)
class CountWidget extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  CountContainer state = CountContainer.of(context);
  return Scaffold(
   appBar: AppBar(
    title: Text("InheritedWidget demo"),
   ),
   body: Text("current count is ${state.mode.count}"),
   floatingActionButton: FloatingActionButton(
    child: Icon(Icons.add),
    onPressed: state.function,
   ),
  );
 }
}

可以看到,InheritedWidget 的數(shù)據(jù)流動(dòng)方式是從父 Widget 到子 Widget 逐層傳遞。

  1. 首先把通過構(gòu)造函數(shù)需要共享的數(shù)據(jù)放到 InheritedWidget 中,然后提供一個(gè)靜態(tài)方法,返回自身;
  2. 然后在把自定義的 InheritedWidget做為父容器,傳入需要共享的數(shù)據(jù);
  3. 最后在子widget 中,通過靜態(tài)方法獲取到 InheritedWidget 對(duì)象,自然就拿到里面的數(shù)據(jù)了。

EventBus

無論是 InheritedWidget 還是 Notificaiton,它們的使用場景都需要依靠 Widget 樹,在使用起來就有點(diǎn)極限了,但Flutter 提供了一個(gè)更好的數(shù)據(jù)傳遞方法--EventBus,傳遞數(shù)據(jù)不再受到限制了。

在原生開發(fā)中,也有使用過 事件總線EventBus,F(xiàn)lutter 中實(shí)現(xiàn)跨組件通信的機(jī)制也是一樣。它遵循發(fā)布 / 訂閱模式,允許訂閱者訂閱事件,當(dāng)發(fā)布者觸發(fā)事件時(shí),訂閱者和發(fā)布者之間可以通過事件進(jìn)行交互。發(fā)布者和訂閱者之間無需有父子關(guān)系,甚至非 Widget 對(duì)象也可以發(fā)布 / 訂閱。這些特點(diǎn)與其他平臺(tái)的事件總線機(jī)制是類似的。

由于 EventBus是第三方庫,所以需要引入:

event_bus: 2.0.0

從第二個(gè)頁面,把數(shù)據(jù)回傳到第一個(gè)頁面

//建立公共的event bus
EventBus eventBus = EventBus();

class CustomEvent {
 String msg;

 CustomEvent(this.msg);
}

class _EventBusPager1State extends State {
 String message = "原來的數(shù)據(jù)";
 StreamSubscription subscription;

 @override
 void initState() {
  subscription = eventBus.on<CustomEvent>().listen((event) {
   setState(() {
    message = event.msg;
   });
  });
  super.initState();
 }

 @override
 Widget build(BuildContext context) {
  return Scaffold(
   appBar: AppBar(
    title: Text("EventBusPager1"),
   ),
   body: Center(
    child: Text(message),
   ),
   floatingActionButton: FloatingActionButton(
    child: Icon(Icons.open_in_browser),
    onPressed: () => Navigator.push(
      context, MaterialPageRoute(builder: (context) => EventBusPager2())),
   ),
  );
 }

 @override
 void dispose() {
  subscription.cancel();
  super.dispose();
 }
}

class EventBusPager2 extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  return Scaffold(
   appBar: AppBar(
    title: Text("EventBusPager2"),
   ),
   body: Center(
    child: Text("EventBusPager1"),
   ),
   floatingActionButton: FloatingActionButton(
    child: Icon(Icons.send),
    onPressed: () {
     eventBus.fire(CustomEvent("data from page 2"));
     Navigator.pop(context);
    },
   ),
  );
 }
}

總結(jié)

通過學(xué)習(xí)了解了 在Flutter 中如何傳遞數(shù)據(jù)的,大致分為四種方式:

  1. 通過屬性,一層一層往下傳
  2. 通過 把數(shù)據(jù)寫到 InheritedWidget的子類,然后把共享的數(shù)據(jù)放到里面,并提獲取自身的供靜態(tài)方法,在需要的地方通過靜態(tài)方法獲取到 InheritedWidget對(duì)象,并獲取數(shù)據(jù),這種方式是能從父widget 傳遞到子widget;
  3. 通過 Notifaction 發(fā)送消息,然后再父 widget 進(jìn)行監(jiān)聽;
  4. 通過eventBus ,通過發(fā)布 / 訂閱模式,來完成數(shù)據(jù)的傳遞,也是開發(fā)中常用的。

以上就是詳解Flutter中的數(shù)據(jù)傳遞的詳細(xì)內(nèi)容,更多關(guān)于Flutter中的數(shù)據(jù)傳遞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android利用傳感器實(shí)現(xiàn)微信搖一搖功能

    Android利用傳感器實(shí)現(xiàn)微信搖一搖功能

    這篇文章主要為大家詳細(xì)介紹了Android利用傳感器實(shí)現(xiàn)微信搖一搖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android基礎(chǔ)之常用控件屬性介紹

    Android基礎(chǔ)之常用控件屬性介紹

    大家好,本篇文章主要講的是Android基礎(chǔ)之常用控件屬性介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android中怎樣避免創(chuàng)建不必要的對(duì)象

    Android中怎樣避免創(chuàng)建不必要的對(duì)象

    對(duì)象的創(chuàng)建從來都不是免費(fèi)的. 一個(gè)使用線程分配池的通用垃圾回收器可以讓臨時(shí)對(duì)象的分配變得廉價(jià)一些, 但是分配內(nèi)存總是比不分配要昂貴得多.所以避免創(chuàng)建不必要的對(duì)象是很重要的一方面。
    2016-08-08
  • Android仿微信拍攝短視頻

    Android仿微信拍攝短視頻

    本文主要對(duì)Android仿微信拍攝短視頻的實(shí)現(xiàn)方法進(jìn)行介紹,其功能設(shè)置為類似于微信,點(diǎn)擊開始拍攝,設(shè)置最長拍攝時(shí)間。具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • Android使用動(dòng)畫設(shè)置ProgressBar進(jìn)度的方法

    Android使用動(dòng)畫設(shè)置ProgressBar進(jìn)度的方法

    這篇文章主要為大家詳細(xì)介紹了Android使用動(dòng)畫設(shè)置ProgressBar進(jìn)度的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解Android平臺(tái)上讀寫NFC標(biāo)簽

    詳解Android平臺(tái)上讀寫NFC標(biāo)簽

    NFC,即Near Field Communication,近距離無線通訊技術(shù),是一種短距離的(通常<=4cm或更短)高頻(13.56M Hz)無線通信技術(shù),可以讓消費(fèi)者簡單直觀地交換信息、訪問內(nèi)容與服務(wù)。
    2017-01-01
  • Android自帶emoji表情的使用方法詳解

    Android自帶emoji表情的使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android自帶emoji表情的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • LayoutAnimation給ListView中的item設(shè)置動(dòng)態(tài)出場效果(實(shí)例)

    LayoutAnimation給ListView中的item設(shè)置動(dòng)態(tài)出場效果(實(shí)例)

    下面小編就為大家?guī)硪黄狶ayoutAnimation給ListView中的item設(shè)置動(dòng)態(tài)出場效果(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 一分鐘快速定位Android啟動(dòng)耗時(shí)問題

    一分鐘快速定位Android啟動(dòng)耗時(shí)問題

    做開發(fā)除了實(shí)現(xiàn)功能,還要注重優(yōu)化,性能優(yōu)化包括的東西還是非常多的,下面這篇文章主要給大家介紹了關(guān)于如何通過一分鐘快速定位Android啟動(dòng)耗時(shí)問題的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Kotlin之在Gradle中無參(no-arg)編譯器插件的使用詳解

    Kotlin之在Gradle中無參(no-arg)編譯器插件的使用詳解

    這篇文章主要介紹了Kotlin之在Gradle中無參(no-arg)編譯器插件的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論

阿拉尔市| 横山县| 弥渡县| 通化县| 阜城县| 西城区| 拉孜县| 仁布县| 马龙县| 陵水| 修水县| 香河县| 吴堡县| 阳信县| 台东县| 红原县| 炉霍县| 锡林浩特市| 崇左市| 电白县| 南平市| 葫芦岛市| 芜湖市| 图木舒克市| 辽源市| 万源市| 永年县| 霞浦县| 固始县| 双柏县| 且末县| 西乌珠穆沁旗| 大丰市| 巨野县| 洪雅县| 应用必备| 新沂市| 黄石市| 周口市| 衡阳市| 南阳市|