Flutter-使用MVP設(shè)計模式封裝刷新列表組件

前言

在flutter的開發(fā)中,經(jīng)常會遇到ListView的上下拉加載的業(yè)務(wù)需求,我也嘗試了對該需求的封裝,地址https://github.com/zhahao/auto_refresh_list_view.

由于flutter是響應(yīng)式的,如果要改變UI的顯示,一般會通過修改成員變量的值,再調(diào)用setState方法,讓state類重新調(diào)用build方法.根據(jù)成員變量的值返回不同的widget.AutoRefreshListView內(nèi)部封裝了RefreshIndicator.childListView.builder()作為主要widget.通過_state來控制ListView顯示不同狀態(tài)的視圖.

設(shè)計模式

使用MVP的設(shè)計模式,將AutoRefreshListView功能拆分出來以下三個部分,并分別由不同Presenter提供實現(xiàn).

  • 狀態(tài)視圖展示
  • 數(shù)據(jù)的提供
  • Item展示

功能實現(xiàn)

AutoRefreshListView內(nèi)部功能實現(xiàn)

上拉

通過ListViewScrollController來判斷

_listScrollController.addListener(() {
      var maxScroll = _listScrollController.position.maxScrollExtent;
      var pixel = _listScrollController.position.pixels;
      if (maxScroll == pixel  && _loadingFlag == false) {
        /// 先將加載中的flag置為true,防止重復(fù)執(zhí)行上拉邏輯
        _loadingFlag = true;
        /// 滾動到底了,需要執(zhí)行上拉操作
     }
});

下拉

使用RefreshIndicator.onRefresh來監(jiān)聽下拉,一旦手指向下拖拽ListView到一定范圍,就會觸發(fā)onRefresh回調(diào).這個時候一般會去請求網(wǎng)絡(luò)數(shù)據(jù),請求回來之后需要調(diào)用setState,RefreshIndicator會被重新build,下拉箭頭就會消失.
偽代碼:

RefreshIndicator(
        child: ListView.builder(itemBuilder: null), 
        onRefresh: () async{
          /// 1.請求網(wǎng)絡(luò)數(shù)據(jù)
          var response = await fetchNetworkData();
          /// 2.1如果成功,刪除之前的數(shù)據(jù)緩存并存儲請求回來的數(shù)據(jù)
          /// 2.2如果失敗,提示失敗
          if (response.success) {
            cleanData();
            restoreData();
            setState((){});
          }else {
            showErrorDialog();
          }
        });

AutoRefreshListView交由Presenter的實現(xiàn)

狀態(tài)視圖展示

使用一個_state將整個ListView的狀態(tài)進行記錄,一旦_state發(fā)生改變就調(diào)用setState方法.切換build方法返回的widget.該功能由RefreshListStateViewIPresenter提供.

enum _AutoRefreshListViewState {
  /// 第一次進入的時候正在加載數(shù)據(jù)
  loadingFirstPage,

  /// 第一次進入加載數(shù)據(jù)失敗
  errorOnLoadFirstPage,

  /// 第一次進入加載數(shù)據(jù)為空
  emptyOnLoadFirstPage,

  /// 沒有更多數(shù)據(jù)
  loadCompletedNoMoreData,

  /// 有更多數(shù)據(jù)
  loadCompletedHasMoreData,

  /// 加載更多時失敗
  errorOnLoadMoreData,

  /// 正在加載更多
  loadingMoreData,
}

數(shù)據(jù)的提供

RefreshListViewDataIPresenter負責提供,抽象了幾個方法,主要包括

  • 獲取數(shù)據(jù)
  • 清空所有數(shù)據(jù),根據(jù)需求可重寫
  • 添加新數(shù)據(jù)
    ...

AutoRefreshListView負責處理RefreshListViewDataIPresenterRefreshListStateViewIPresenter之間的邏輯關(guān)系.

Item展示

使用list_view_item_builder三方實現(xiàn),該庫提供了與iOS的UITableview基本一致的delegatedataSource方法.非常方便的構(gòu)建Listviewitem.且對該庫進行了presenter處理,由RefreshListViewItemIPresenter提供item的實現(xiàn).

總結(jié)

感覺MVP的設(shè)計模式在flutter還是可以使用的,提高代碼邏輯的復(fù)用性.而且dart支持多繼承,那么所有的presenter都可以使用with語法聚合在一個類里面實現(xiàn).這樣對于簡單的邏輯使用也很方便.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻顽,一起剝皮案震驚了整個濱河市域仇,隨后出現(xiàn)的幾起案子散休,更是在濱河造成了極大的恐慌哺哼,老刑警劉巖请契,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伐蒂,死亡現(xiàn)場離奇詭異迷扇,居然都是意外死亡瑟蜈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門姐帚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏垮,“玉大人,你說我怎么就攤上這事罐旗∩磐簦” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵九秀,是天一觀的道長遗嗽。 經(jīng)常有香客問我,道長鼓蜒,這世上最難降的妖魔是什么痹换? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮都弹,結(jié)果婚禮上娇豫,老公的妹妹穿的比我還像新娘。我一直安慰自己畅厢,他們只是感情好冯痢,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著框杜,像睡著了一般浦楣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咪辱,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天振劳,我揣著相機與錄音,去河邊找鬼油狂。 笑死澎迎,一個胖子當著我的面吹牛庐杨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夹供,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灵份,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哮洽?” 一聲冷哼從身側(cè)響起填渠,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸟辅,沒想到半個月后氛什,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡匪凉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年枪眉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片再层。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贸铜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聂受,到底是詐尸還是另有隱情蒿秦,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布蛋济,位于F島的核電站棍鳖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碗旅。R本人自食惡果不足惜渡处,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祟辟。 院中可真熱鬧医瘫,春花似錦、人聲如沸川尖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮喳。三九已至,卻和暖如春缰贝,著一層夾襖步出監(jiān)牢的瞬間馍悟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工剩晴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锣咒,地道東北人侵状。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像毅整,于是被迫代替她去往敵國和親趣兄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 前言最近Google開源的跨平臺移動開發(fā)框架Flutter非车考担火熱艇潭,推出了1.0的正式版,趁著熱度戏蔑,我也是抽空粗略...
    飄逸解構(gòu)閱讀 6,286評論 0 13
  • 國慶后面兩天在家學(xué)習(xí)整理了一波flutter蹋凝,基本把能擼過能看到的代碼都過了一遍,此文篇幅較長总棵,建議保存(star...
    Nealyang閱讀 4,343評論 1 17
  • 城市的文明有序發(fā)展鳍寂,離不開規(guī)劃管理。住宅小區(qū)也一樣情龄,家有家規(guī)迄汛,國有國法。沒有規(guī)矩刃唤,不成方圓隔心。人人遵守規(guī)則,人人和睦...
    君遠近閱讀 217評論 0 1
  • 唱歌尚胞,各種技巧假聲轉(zhuǎn)聲飆高音等都要掌握硬霍,根據(jù)需要用出來,才能表達情感笼裳,寫作同理唯卖,各種手法修辭都能熟練運用 有個公眾...
    菜心昕閱讀 185評論 0 1
  • 朋友之間應(yīng)該是怎樣的呢,我也說不太清楚躬柬,我只知道拜轨,朋友之前是應(yīng)該互相幫助的,是應(yīng)該互相分享自己的快樂的允青,是應(yīng)該互相...
    育兒讀書分享閱讀 185評論 0 0