四榛瓮、Flutter之組件間通信

這里學了兩種通信方式铺董,一種是回調、另一種是借用第三方庫event_bus禀晓,其他的還有GlobalKey精续、ValueNotifier、Redux等粹懒,后續(xù)再研究重付。

一、回調

組件間通信可以用回調方式凫乖,這里不需要像java新建一個接口類再實現(xiàn)确垫,Dart是支持把方法作為對象傳遞的,也就是說可以直接把需要回調的方法作為變量傳給目標帽芽。

/**
 * 父子删掀、兄弟組件通信
 */
class WidgetContactDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Material(
        child: new Scaffold(
      appBar: new AppBar(
        title: new Text("組件間通信"),
      ),

      //主體
      body: new ParentWidget(),
    ));
  }
}

//父組件
class ParentWidget extends StatefulWidget {
  @override
  State createState() {
    return _ParentWidget();
  }
}

class _ParentWidget extends State<ParentWidget> {
  var bgColor; //父組件背景色
  var btnColor; //子組件背景色

  changeParentColor(color) {
    setState(() {
      bgColor = color;
    });
  }

  changeButtonColor() {
    setState(() {
      btnColor = RandomColor().get();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: MediaQuery.of(context).size.width,
      color: bgColor,
      child: Column(
        children: <Widget>[
          RaisedButton(
            onPressed: changeButtonColor,
            child: Text('Button1,點擊修改button2背景色'),
          ),
          //這里把方法changeParentColor和變量btnColor傳入MyButton导街,如果changeParentColor是無參函數披泪,可以直接用MyButton(changeParentColor,btnColor),
          MyButton((c) => changeParentColor(c), btnColor),
        ],
      ),
    );
  }
}

//子組件按鈕,需要傳入一個點擊事件callback和一個背景色btnColor搬瑰,點擊時會調用callback款票,而btnColor在外部修改的時候,子組件也會響應修改泽论。
class MyButton extends StatefulWidget {
  Function callback;
  var btnColor;

  //dart構造函數艾少,可以直接把傳入參數賦值給相應變量
  MyButton(this.callback, this.btnColor);

  //下面這種寫法的構造函數支持MyButton(callback:(c)=>changeParentColor(c),btnColor:btnColor),
//  MyButton({Key key,this.callback,this.btnColor}) : super(key:key) ;

  @override
  State createState() {
    return _MyButton();
  }
}

class _MyButton extends State<MyButton> {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      //State里可以通過widget訪問其StatefulWidget里的變量,此處常見錯誤佩厚!不能寫作widget.callback(Colors.black12)
      onPressed: () => widget.callback(RandomColor().get()),
      child: Text('Button2姆钉,點擊修改父控件背景色'),
      color: widget.btnColor,
    );
  }
}

//隨機顏色類
class RandomColor {
  final bgColors = [
    Colors.white,
    Colors.yellow,
    Colors.orange,
    Colors.cyan,
    Colors.lime,
    Colors.pinkAccent
  ];

  Color get() {
    return bgColors[Random.secure().nextInt(bgColors.length)];
  }
}

這段代碼實現(xiàn)了點擊button1修改button2的顏色,點擊button2修改parent的顏色,代碼中的new關鍵字都省略了潮瓶,這是dart2中的新特性陶冷。
從外部修改button2的顏色比較簡單,只要在button1點擊事件中修改傳入button2的變量btnColor即可毯辅;
從button2點擊修改父組件顏色埂伦,就需要用到回調,父控件構建button2的時候傳入回調函數MyButton((c) => changeParentColor(c), btnColor),這里changeParentColor是作為一個對象之間傳入子控件賦值給callback的思恐,而子控件在onPressed: () => widget.callback(RandomColor().get()),這里設置了點擊事件沾谜,點擊時調用widget.callback即changeParentColor,以達到從內部向外部通信的目的胀莹,注意不能寫成onPressed:widget.callback(RandomColor().get())

二基跑、eventbus

先在pubspec.yaml里增加依賴

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  event_bus: ^1.0.1//增加依賴

dart文件中再導入包

import 'package:event_bus/event_bus.dart';

接下來就可以使用eventbus進行通信了,下面代碼實現(xiàn)了點擊button3可以修改button4的顏色描焰,也就是點擊的時發(fā)送一個事件媳否,button4監(jiān)聽到該事件就改變自身顏色荆秦。

/**
 * 以下是用eventbus進行通信
 */

EventBus eventBus = new EventBus();

//新建修改顏色的事件
class ColorEvent{
  Color color;
  ColorEvent(this.color);
}

//button3
class MyButton3 extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      //點擊的時候發(fā)送改變顏色事件
      onPressed: () => eventBus.fire(ColorEvent(RandomColor().get())),
      child: Text('Button3步绸,點擊修改Button4顏色'),
    );
  }
}

//button4
class MyButton4 extends StatefulWidget {

  @override
  State createState() {
    return _MyButton4();
  }
}

class _MyButton4 extends State<MyButton4> {
  Color bgColor;

  @override
  void initState() {
    //注冊eventBus事件,監(jiān)聽到變化的時候調用changeColor(color)
    eventBus.on<ColorEvent>().listen((ColorEvent data) => changeColor(data.color));
    super.initState();
  }

  changeColor(color){
    //若不對mounted進行判斷兽泄,會報錯 setState() called after dispose()
    if(mounted){
      setState(() {
        bgColor=color;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: ()=>{},//必須給onPressed一個空方法胃珍,不能是null觅彰,否則無法修改color屬性
      child: Text('Button4'),
      color: bgColor,
    );
  }
}

eventbus的Git地址:https://github.com/marcojakob/dart-event-bus
詳解可參考:https://cloud.tencent.com/developer/article/1338289

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赘娄,隨后出現(xiàn)的幾起案子性置,更是在濱河造成了極大的恐慌,老刑警劉巖隐砸,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械馆,死亡現(xiàn)場離奇詭異珊搀,居然都是意外死亡境析,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門缆八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栏妖,“玉大人吊趾,你說我怎么就攤上這事续滋。” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵崭庸,是天一觀的道長执赡。 經常有香客問我跌帐,道長究履,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任脸狸,我火速辦了婚禮最仑,結果婚禮上,老公的妹妹穿的比我還像新娘肥惭。我一直安慰自己盯仪,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布蜜葱。 她就那樣靜靜地躺著,像睡著了一般耀石。 火紅的嫁衣襯著肌膚如雪牵囤。 梳的紋絲不亂的頭發(fā)上爸黄,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音揭鳞,去河邊找鬼炕贵。 笑死,一個胖子當著我的面吹牛野崇,可吹牛的內容都是我干的称开。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼乓梨,長吁一口氣:“原來是場噩夢啊……” “哼鳖轰!你這毒婦竟也來了?” 一聲冷哼從身側響起扶镀,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蕴侣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臭觉,有當地人在樹林里發(fā)現(xiàn)了一具尸體昆雀,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年蝠筑,在試婚紗的時候發(fā)現(xiàn)自己被綠了狞膘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡什乙,死狀恐怖客冈,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情稳强,我是刑警寧澤场仲,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站退疫,受9級特大地震影響渠缕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜褒繁,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一亦鳞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棒坏,春花似錦燕差、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喂窟,卻和暖如春测暗,著一層夾襖步出監(jiān)牢的瞬間央串,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工碗啄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留质和,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓稚字,卻偏偏與公主長得像饲宿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胆描,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程瘫想,因...
    小菜c閱讀 6,440評論 0 17
  • 原文在此,此處只為學習 Widget與ElementWidget主要接口Stateless WidgetState...
    lltree閱讀 4,515評論 0 1
  • 1.App結構和導航 Scaffold:Material Design布局結構的基本實現(xiàn)袄友。此類提供了用于顯示dra...
    慕容小偉閱讀 3,730評論 0 3
  • 第1步:創(chuàng)建初始Flutter應用 創(chuàng)建一個簡單的 Flutter 應用殿托。主要編輯 Dart 代碼所在的 lib ...
    小白_Sing閱讀 957評論 0 0
  • 到了大學之后,更自由剧蚣,更開放支竹,解放思維,覺得方向很多鸠按,道路很多……這本應是好的現(xiàn)象礼搁,開拓思維,發(fā)展自己潛能目尖,開發(fā)可...
    冰雪月er閱讀 604評論 2 2