探究flutter中的Builder和StatefulBuilder

????flutter開發(fā)的官方推薦是響應(yīng)式編程统舀,響應(yīng)式編程簡(jiǎn)單理解是數(shù)據(jù)流變化自動(dòng)驅(qū)動(dòng)view層刷新的一種開發(fā)方式匆骗;這樣的開發(fā)讓業(yè)務(wù)和view層徹底解耦,是很棒的一種開發(fā)思想誉简,所以flutter的開發(fā)就成了widget的組裝及其屬性的數(shù)據(jù)綁定碉就。但是我們很多時(shí)候不僅僅是進(jìn)行數(shù)據(jù)綁定,view層也不能狹隘的理解為widget的組裝與屬性賦值闷串,view層結(jié)合view相關(guān)的一些業(yè)務(wù)邏輯的處理才能讓架構(gòu)更為合理瓮钥,比如view點(diǎn)擊事件的設(shè)定、新的路由的打開烹吵、新的對(duì)話框的打開碉熄、動(dòng)畫相關(guān)的操作等,此時(shí)我們不僅需要在widget中進(jìn)行一些業(yè)務(wù)邏輯的處理肋拔,我們還需要得到這個(gè)widget對(duì)于的BuildContext锈津。下面的代碼應(yīng)該非常常見(jiàn)了吧:

      body: Center(
        child: Builder(
          builder: (context) {
            return Text("Builder").gesture(onTap: () {
              showDialog(context: context, child: Text("dialog"));
            });
          },
        ),
      ),

????如果你想在點(diǎn)擊了某個(gè)組件之后對(duì)界面進(jìn)行刷新,那么通常你需要定義一個(gè)StatefulWidget在需要刷新的地方調(diào)用setState凉蜂,但是StatefulBuilder看起來(lái)也是一個(gè)不錯(cuò)的選擇:

這里沒(méi)有使用定義StatefulWidget的方式一姿,因?yàn)檫@個(gè)邏輯很簡(jiǎn)單,定義StatefulWidget是麻煩而且沒(méi)有必要的
      body: Center(
        child: StatefulBuilder(
          builder: (BuildContext context, StateSetter setState) {
            return Text("clickTimes$clickTimes").gesture(onTap: () {
              setState(() {
                clickTimes++;
              });
            });
          },
        ),
      ),

????以上Builder類和StatefulBuilder都是官方提供的類跃惫,以便開發(fā)者使用叮叹,但我們不能滿足于簡(jiǎn)簡(jiǎn)單單的使用,我們還要知道他的本質(zhì)爆存。
????那先來(lái)看看Builder吧:


class Builder extends StatelessWidget {
  const Builder({
    Key key,
    @required this.builder,
  }) : assert(builder != null),
       super(key: key);
  final WidgetBuilder builder;

  @override
  Widget build(BuildContext context) => builder(context);
}

????Builder 的源碼非常簡(jiǎn)單蛉顽,其實(shí)就是一個(gè)StatelessWidget ,只不過(guò)是其build方法先较,通過(guò)傳入的builder方法由使用者實(shí)現(xiàn)携冤。再看看傳入的builder的簽名:

///  * [IndexedWidgetBuilder], which is similar but also takes an index.
///  * [TransitionBuilder], which is similar but also takes a child.
///  * [ValueWidgetBuilder], which is similar but takes a value and a child.
typedef WidgetBuilder = Widget Function(BuildContext context);

????也很簡(jiǎn)單悼粮,就是一個(gè)參數(shù)為BuilderContext返回值為Widget的Fuction而已。
????下面看看StatefulBuilder

class StatefulBuilder extends StatefulWidget {
  const StatefulBuilder({
    Key key,
    @required this.builder,
  }) : assert(builder != null),
       super(key: key);
  final StatefulWidgetBuilder builder;

  @override
  _StatefulBuilderState createState() => _StatefulBuilderState();
}

class _StatefulBuilderState extends State<StatefulBuilder> {
  @override
  Widget build(BuildContext context) => widget.builder(context, setState);
}

????StatefulBuilder 的源碼也非常簡(jiǎn)單曾棕,其實(shí)就是一個(gè)StatefulWidget 扣猫,與Builder的不同之處在于其傳入的builder的函數(shù)簽名包含兩個(gè)參數(shù),多了一個(gè)setState翘地,setState是一個(gè)函數(shù)引用申尤,調(diào)用這個(gè)函數(shù)可以導(dǎo)致這個(gè)StatefulWidget 的bulide方法被調(diào)用,StatefulBuilder 就是通過(guò)傳入的builder方法將setState傳遞給使用者衙耕,在外部刷新這個(gè)widget昧穿。再看看StatefulBuilder 的builder的簽名:

/// Signature for the builder callback used by [StatefulBuilder].
///
/// Call [setState] to schedule the [StatefulBuilder] to rebuild.
typedef StatefulWidgetBuilder = Widget Function(BuildContext context, StateSetter setState);

???? 非常簡(jiǎn)單,就是參數(shù)為BuilderContext和StateSetter 返回值為Widget的Fuction而已橙喘。
???? 以上就是關(guān)于Builder和StatefulBuilder的探究過(guò)程时鸵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厅瞎,隨后出現(xiàn)的幾起案子饰潜,更是在濱河造成了極大的恐慌,老刑警劉巖和簸,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彭雾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡比搭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門南誊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)身诺,“玉大人,你說(shuō)我怎么就攤上這事抄囚∶股模” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵幔托,是天一觀的道長(zhǎng)穴亏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)重挑,這世上最難降的妖魔是什么嗓化? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮谬哀,結(jié)果婚禮上刺覆,老公的妹妹穿的比我還像新娘。我一直安慰自己史煎,他們只是感情好谦屑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布驳糯。 她就那樣靜靜地躺著,像睡著了一般氢橙。 火紅的嫁衣襯著肌膚如雪酝枢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天悍手,我揣著相機(jī)與錄音帘睦,去河邊找鬼。 笑死谓苟,一個(gè)胖子當(dāng)著我的面吹牛官脓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涝焙,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼卑笨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仑撞?” 一聲冷哼從身側(cè)響起赤兴,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隧哮,沒(méi)想到半個(gè)月后桶良,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沮翔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年陨帆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片采蚀。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疲牵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榆鼠,到底是詐尸還是另有隱情纲爸,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布妆够,位于F島的核電站识啦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏神妹。R本人自食惡果不足惜颓哮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸵荠。 院中可真熱鬧题翻,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至姜挺,卻和暖如春齿税,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炊豪。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工凌箕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人词渤。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓牵舱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缺虐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芜壁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容