[Flutter]從零開始實現一個巢狀滑動的PageView(三)

lwlizhe發表於2020-03-13

目錄

  1. [Flutter]從零開始實現一個巢狀滑動的PageView(一)
  2. [Flutter]從零開始實現一個巢狀滑動的PageView(二)
  3. [Flutter]從零開始實現一個巢狀滑動的PageView(三)

前言

前面兩篇文章基本實現了所需的功能,那麼綜合整合一下,並做一些稍微的擴充

思路整合

1. 基本整體上的思路

由最底層的子PageView負責計算,正常情況下按一般的pageView的邏輯來,當遇到需要巢狀滑動的時候,計算出滑動結果並呼叫父Page的controller。

所以按照這個邏輯,底層的scrollerController就是操作核心,計算邏輯什麼的放在那裡,然後需要的時候控制父page就行

2. 計算核心邏輯

正常情況直接參考pageView 的就行,我們唯一需要考慮的是巢狀滑動情況,這部分參考nestedScrollerView的部分,說白了就是判斷一下是否是過度滑動、快速滑動什麼的,在需要的情況下交給父ScrollerController處理。所幸的是,基本的動畫、復位演算法,已經有現成方法實現,是否是過度滑動也可以通過controller所繫結的position中攜帶的pixel、maxScrollExtent、minScrollExtent等資訊來判斷,所以問題也不大

3、如何打通父page和子Page

還是參考NestedScrollerView,PrimaryScrollerController提供了一種傳遞controller的方式,所以父Page只需要將自己的controller放入PrimaryScrollerController這個InHeritedWidget即可,子Page通過它就能拿到controller,進而控制父page的滑動。

需要做的事

1.修改pageView,使其有PrimaryScroolerController
2.自定義ScrollerController,提供position和相關必要資訊
3.自定義ScrollerPosition,並讓其繼承ScrollActivityDelegate,自定義activity和控制邏輯,加入計算核心邏輯

還可以擴充一下

套娃功能,現在目前是父page和子page是分開的,但是想一想,父page其實也就提供自己controller一個很小的功能,完全可以整合到子page中去,直接用一個pageView自動判斷需不需要巢狀功能嘛(說白了就是判斷下能不能通過PrimaryScrollerController拿到父page的自定義ScrollerController就行了)

後記

誰能想到這個春節假期這麼長……回來人傻了,差點認不出我之前寫的啥…………趕快插個眼理一下思路

順便水個文章,調整下狀態。

事實證明,一個月不敲程式碼,有些東西就能忘得差不多……

相關文章