dart擴(kuò)展函數(shù)的幾種用法

簡(jiǎn)介:
從2.7及以上的dart版本開始,讓人殷切期待的擴(kuò)展函數(shù)來了惊完。當(dāng)你想擴(kuò)展別人的函數(shù)庫(kù)或者官方的SDK稽莉,如果通過更改api的方式則意味著你需要重建一個(gè)代碼分支,維護(hù)一個(gè)分支是相當(dāng)麻煩的事情坛猪, 如果這個(gè)時(shí)候使用擴(kuò)展方法將是非常方便的脖阵。擴(kuò)展不僅可以定義方法,還可以定義getter墅茉,setter和operator命黔。雖然擴(kuò)展方法中不能用于用dynamic類型,但卻支持更強(qiáng)大的泛型擴(kuò)展就斤『纺迹總有人吐槽flutter開發(fā)widget嵌套太深的問題,擴(kuò)展函數(shù)的使用能夠讓代碼的結(jié)構(gòu)變得極為簡(jiǎn)潔洋机,加上泛型擴(kuò)展的使用可以使代碼鏈?zhǔn)秸{(diào)用一鏈到底坠宴。

原理:
擴(kuò)展函數(shù)調(diào)用起來跟原生方法一樣自然,使用起來也非常方便绷旗,但是這樣的用法會(huì)不會(huì)帶來性能方面的問題呢喜鼓?其實(shí)擴(kuò)展函數(shù)的本質(zhì)是針對(duì)接收者的靜態(tài)類型進(jìn)行了解析,即擴(kuò)展方法是靜態(tài)解析的衔肢,擴(kuò)展函數(shù)的實(shí)現(xiàn)非常簡(jiǎn)單庄岖,它沒有修改接受者類型的成員,僅僅是通過靜態(tài)方法來實(shí)現(xiàn)的角骤,它們與調(diào)用靜態(tài)函數(shù)一樣快速隅忿。
廢話少說,下面以本人開發(fā)中的使用的經(jīng)驗(yàn)舉幾個(gè)例子加以說明邦尊。


widget擴(kuò)展:
extension WidgetExt on Widget {
  Widget padding(EdgeInsetsGeometry padding) {
    return Padding(
      child: this,
      padding: padding,
    );
  }

  Material gesture({
    GestureTapCallback onTap,
    GestureTapCallback onDoubleTap,
    GestureLongPressCallback onLongPress,
  }) {
    return Material(
      child: InkWell(
        child: this,
        onTap: onTap,
        onDoubleTap: onDoubleTap,
        onLongPress: onLongPress,
      ),
    );
  }
}

String擴(kuò)展:
extension StringExt on String {
  double toDouble() {
    return double.parse(this);
  }
  int toInt() {
    return int.parse(this);
  }
  bool isMobile(){
    return RegExp(r'^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8])|(19)[0-9])\d{8}$').hasMatch(this);
  }
}

Object擴(kuò)展:
extension ObjectExt on Object {
  bool isNullOrEmpty() {
    if (this is String)
      return (this as String).isEmpty;
    else if (this is Iterable) return (this as Iterable).isEmpty;
    return this == null;
  }
}

bool擴(kuò)展:
extension BoolExt on bool {
  bool not() {
    return !this;
  }

  bool and(bool val) {
    return this && val;
  }

  bool or(bool val) {
    return this || val;
  }
}

泛型擴(kuò)展:
extension AllExt<T> on T {
  T apply(f(T e)) {
    f(this);
    return this;
  }

  R let<R>(R f(T e)) {
    return f(this);
  }
}

調(diào)用示例如下:僅簡(jiǎn)單舉幾個(gè)調(diào)用例子背桐,其余的調(diào)用有興趣者自行嘗試。

實(shí)現(xiàn)單層沒有嵌的padding和點(diǎn)擊事件

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            )
                    .padding(EdgeInsets.all(10))
                    .gesture(onTap: () {
              
            }),
          ],
        ),
      ),

實(shí)現(xiàn)String正則的判斷

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '13646176072'.isMobile()?"手機(jī)號(hào)":"不是手機(jī)號(hào)",
            ),
          ],
        ),
      ),

bool類型的鏈?zhǔn)秸{(diào)用

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              ['13646176072', "fgdgdfgdf", 'trtreter']
                  .isNullOrEmpty()
                  .not()
                  .and(true)
                  .or(false)
                  .toString(),
            ),
          ],
        ),
      ),

泛型擴(kuò)展的鏈?zhǔn)秸{(diào)用:這個(gè)用法非常值得一提蝉揍,在原生開發(fā)中kotlin的語(yǔ)法糖是相當(dāng)牛掰的链峭,kotlin能夠使代碼的編寫鏈成一整個(gè)鏈而不使用一個(gè)中間變量,這樣使得代碼優(yōu)雅疑苫,封裝的更完美熏版。幸運(yùn)的是dart雖然沒有提供很多的語(yǔ)法糖,但卻提供了泛型擴(kuò)展函數(shù)捍掺,我們可以依此自定義非常強(qiáng)大的語(yǔ)法糖撼短,調(diào)用示例如下,經(jīng)過層層無聊的轉(zhuǎn)化得到一個(gè)字符串而沒有定義一個(gè)函數(shù)挺勿,也沒有中間變量造成變量污染:

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
                    People(11, 1, 30)
             .apply((val) {
              val.introduce = "我今年${val.age}${val.sex}${val.weight}";
            }).let((val) {
              if (val.sex == 1) return Monkey(11, 0, 30);
              return Monkey(11, 1, 30);
            }).let((val) {
              if (val.sex == 1) return "大猴子";
              return "程序猿";
            }).let((val) {
              return "整這么多干啥呢曲横,好麻煩啊";
            })),
          ],
        ),
      ),

通過以上示例可以看出擴(kuò)展函數(shù)是很有可玩性的,她能大大提高代碼質(zhì)量,讓編程變得有趣禾嫉,何不一起來探討探討呢灾杰?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熙参,隨后出現(xiàn)的幾起案子艳吠,更是在濱河造成了極大的恐慌未玻,老刑警劉巖腹缩,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異峦甩,居然都是意外死亡黍匾,警方通過查閱死者的電腦和手機(jī)栏渺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锐涯,“玉大人磕诊,你說我怎么就攤上這事∥齐纾” “怎么了霎终?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)壶笼。 經(jīng)常有香客問我神僵,道長(zhǎng)雁刷,這世上最難降的妖魔是什么覆劈? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮沛励,結(jié)果婚禮上责语,老公的妹妹穿的比我還像新娘。我一直安慰自己目派,他們只是感情好坤候,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著企蹭,像睡著了一般白筹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谅摄,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天徒河,我揣著相機(jī)與錄音,去河邊找鬼送漠。 笑死顽照,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播代兵,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼尼酿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了植影?” 一聲冷哼從身側(cè)響起裳擎,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎思币,沒想到半個(gè)月后句惯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡支救,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年抢野,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片各墨。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡指孤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贬堵,到底是詐尸還是另有隱情恃轩,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布黎做,位于F島的核電站叉跛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒸殿。R本人自食惡果不足惜筷厘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宏所。 院中可真熱鬧酥艳,春花似錦、人聲如沸爬骤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)霞玄。三九已至骤铃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坷剧,已是汗流浹背惰爬。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留听隐,地道東北人补鼻。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親风范。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咨跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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