Flutter(83):NotificationListener

Flutter教學(xué)目錄持續(xù)更新中

Github源代碼持續(xù)更新中

1.NotificationListener介紹

widget通知監(jiān)聽

2.NotificationListener屬性

  • child:widget
  • onNotification:NotificationListenerCallback<Notification>秀菱,返回值true表示消費(fèi)掉當(dāng)前通知不再向上一級NotificationListener傳遞通知,false則會再向上一級NotificationListener傳遞通知;這里需要注意的是通知是由下而上去傳遞的瘾敢,所以才會稱作冒泡通知

3.ScrollNotification

ScrollNotification是一個抽象類咙鞍,它的子類還有:

  • ScrollStartNotification:滑動開始通知
  • ScrollUpdateNotification:滑動中通知箫柳,滑動過程中會一直回調(diào)
  • ScrollEndNotification:滑動結(jié)束通知
  • OverscrollNotification:滑動位置未改變通知镀脂,這個一般只有在滑動到列表邊界才會回調(diào)苍碟,且需要設(shè)置不可越界酒觅,即physics為ClampingScrollPhysics,這里要注意安卓默認(rèn)是這樣微峰,但是ios平臺默認(rèn)是彈性邊界
  • UserScrollNotification:用戶滑動通知舷丹,這個跟ScrollUpdateNotification的區(qū)別是他指揮有滑動開始后以及滑動結(jié)束后回調(diào)

4.Notification.ScrollMetrics屬性

  • pixels:當(dāng)前絕對位置
  • atEdge:是否在頂部或底部
  • axis:垂直或水平滾動
  • axisDirection:滾動方向描述是down還是up,這個受列表reverse影響蜓肆,正序就是down倒序就是up颜凯,并不代表列表是上滑還是下滑
  • extentAfter:視口底部距離列表底部有多大
  • extentBefore:視口頂部距離列表頂部有多大
  • extentInside:視口范圍內(nèi)的列表長度
  • maxScrollExtent:最大滾動距離,列表長度-視口長度
  • minScrollExtent:最小滾動距離
  • viewportDimension:沿滾動方向視口的長度
  • outOfRange:是否越過邊界

4.使用

  _myChild() {
    return ListView.builder(
      itemBuilder: (context, index) => ListTile(title: Text('item $index')),
      itemCount: 30,
      reverse: true,
      // physics: BouncingScrollPhysics(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('NotificationListener'),
      ),
      body: NotificationListener<ScrollNotification>(
        onNotification: (notification) {
          ScrollMetrics metrics = notification.metrics;
          print('ScrollNotification####################');
          print('pixels = ${metrics.pixels}');
          print('atEdge = ${metrics.atEdge}');
          print('axis = ${metrics.axis}');
          print('axisDirection = ${metrics.axisDirection}');
          print('extentAfter = ${metrics.extentAfter}');
          print('extentBefore = ${metrics.extentBefore}');
          print('extentInside = ${metrics.extentInside}');
          print('maxScrollExtent = ${metrics.maxScrollExtent}');
          print('minScrollExtent = ${metrics.minScrollExtent}');
          print('viewportDimension = ${metrics.viewportDimension}');
          print('outOfRange = ${metrics.outOfRange}');
          print('ScrollNotification####################');
          return false;
        },
        child: NotificationListener<ScrollUpdateNotification>(
          onNotification: (notification) {
            print('ScrollUpdateNotification####################');
            return false;
          },
          child: NotificationListener<OverscrollNotification>(
            onNotification: (notification) {
              print('OverscrollNotification####################');
              return false;
            },
            child: NotificationListener<ScrollStartNotification>(
              onNotification: (notification) {
                print('ScrollStartNotification####################');
                return false;
              },
              child: NotificationListener<ScrollEndNotification>(
                onNotification: (notification) {
                  print('ScrollEndNotification####################');
                  return false;
                },
                child: _myChild(),
              ),
            ),
          ),
        ),
      ),
    );
  }
image.png

5.系統(tǒng)提供的其他Notification

Notification是所有通知監(jiān)聽的頂級父類仗扬,它的子類有:

  • LayoutChangedNotification:這是一個空實(shí)現(xiàn)子類装获,他的子類有ScrollNotification,SizeChangedLayoutNotification
  • SizeChangedLayoutNotification:這是一個空實(shí)現(xiàn)子類厉颤,一般不會用到
  • DraggableScrollableNotification:DraggableScrollableSheet的拖拽通知穴豫,這個后面再介紹
  • OverscrollIndicatorNotification:這是滑動指示器的通知監(jiān)聽,例如Scrollbar逼友,需要注意的是這個只有在滑動到頭部或者尾部才會回調(diào)精肃,而且滑動布局也需要是不可越界的,即physics為ClampingScrollPhysics
    這里的代碼就在上期Flutter(82):Scroll組件之Scrollbar上修改一下:
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scrollbar'),
      ),
      body: NotificationListener<OverscrollIndicatorNotification>(
        onNotification: (notification) {
          //滑動指示器是否在頭部 true在前端帜乞,false在末端
          print('${notification.leading}');
          return true;
        },
        child: Scrollbar(
          radius: Radius.circular(10),
          thickness: 10,
          child: ListView.builder(
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('item $index'),
              );
            },
            itemCount: 30,
          ),
        ),
      ),
    );
  }
  • KeepAliveNotification:這個留意過列表復(fù)用的源碼的話司抱,例如ListView,就會知道addAutomaticKeepAlives就是使用這個來保存狀態(tài)的

6.自定義Notification

這里我們做個簡單的演示

      body: NotificationListener<_CustomNotification>(
        onNotification: (notification) {
          print('1 ${notification.msg}');
          return true;
        },
        child: NotificationListener<_CustomNotification>(
          onNotification: (notification) {
            print('2 ${notification.msg}');
            return true;
          },
          child: Builder(builder: (context) {
            return RaisedButton(
              onPressed: () {
                _CustomNotification('點(diǎn)擊了Button').dispatch(context);
              },
              child: Text('RaisedButton'),
            );
          }),
        ),
      ),

class _CustomNotification extends Notification {
  _CustomNotification(this.msg);

  final String msg;
}
image.png

這里在2級NotificationListener處消費(fèi)掉當(dāng)前的通知了黎烈,所以不再向1級NotificationListener傳遞通知了习柠,如果將2級NotificationListener處設(shè)置為false,則會傳遞

image.png

下一節(jié):DraggableScrollableSheet照棋、DraggableScrollableNotification

Flutter(84):DraggableScrollableSheet资溃、DraggableScrollableNotification

Flutter教學(xué)目錄持續(xù)更新中

Github源代碼持續(xù)更新中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畦徘,一起剝皮案震驚了整個濱河市拼岳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乘综,老刑警劉巖符隙,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趴捅,死亡現(xiàn)場離奇詭異垫毙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拱绑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門综芥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猎拨,你說我怎么就攤上這事膀藐。” “怎么了迟几?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵消请,是天一觀的道長栏笆。 經(jīng)常有香客問我类腮,道長,這世上最難降的妖魔是什么蛉加? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任蚜枢,我火速辦了婚禮,結(jié)果婚禮上针饥,老公的妹妹穿的比我還像新娘厂抽。我一直安慰自己,他們只是感情好丁眼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布筷凤。 她就那樣靜靜地躺著,像睡著了一般苞七。 火紅的嫁衣襯著肌膚如雪藐守。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天蹂风,我揣著相機(jī)與錄音卢厂,去河邊找鬼。 笑死惠啄,一個胖子當(dāng)著我的面吹牛慎恒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撵渡,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼融柬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趋距?” 一聲冷哼從身側(cè)響起丹鸿,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棚品,沒想到半個月后靠欢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廊敌,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年门怪,在試婚紗的時候發(fā)現(xiàn)自己被綠了骡澈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡掷空,死狀恐怖肋殴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坦弟,我是刑警寧澤护锤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站酿傍,受9級特大地震影響烙懦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赤炒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一氯析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莺褒,春花似錦掩缓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尘执,卻和暖如春舍哄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背正卧。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工蠢熄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炉旷。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓签孔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窘行。 傳聞我的和親對象是個殘疾皇子饥追,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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

  • 概述 ListView GridView sliver 滾動的監(jiān)聽 一、ListView 移動端數(shù)據(jù)量比較大時罐盔,我...
    IIronMan閱讀 440評論 0 1
  • Flutter無限輪播Banner實(shí)現(xiàn) [TOC] 手勢 ? Flutter中的手勢系統(tǒng)有兩個獨(dú)立的層但绕。第一層...
    zcwfeng閱讀 5,878評論 1 6
  • 我們在APP中經(jīng)常可以看到各種抽屜,比如:某音的評論以及經(jīng)典的豆瓣評論捏顺。這種抽屜效果六孵,都是十分好看經(jīng)典的設(shè)計。但是...
    徐愛卿閱讀 14,964評論 14 59
  • 列表是最常用的一個組件幅骄,通常相對于比較大的數(shù)據(jù)量都會使用到列表來顯示劫窒。 滾動監(jiān)聽 當(dāng)使用 ScrollView、L...
    iwakevin閱讀 57,595評論 7 45
  • flutter 滾動隱藏懸浮按鈕 實(shí)現(xiàn)思路拆座,當(dāng)開始滾動的時候主巍,執(zhí)行動畫讓中間的懸浮按鈕向右移動。當(dāng)滾動結(jié)束的時候復(fù)...
    Faith_K閱讀 2,951評論 0 3