【Flutter】熊孩子拆元件系列之拆ListView(四)—— _ScrollableScope
theme: condensed-night-purple
小知識,大挑戰!本文正在參與「程式設計師必備小知識」創作活動
本文已參與 「掘力星計劃」 ,贏取創作大禮包,挑戰創作激勵金。
前言
按照順序,上次分析了 GlowingOverscrollIndicator ,雖然那東西難度不大,不過作為組合型Widget,其本身在Widget樹中佔了不少;
所以去掉相關的部分,接下來分析的是:_ScrollableScope
目錄
http://juejin.cn/post/7016538861580845063
同樣的慣例,先看註釋,概念分析
不過呢,這回註釋就短短兩行:
// Enable Scrollable.of() to work as if ScrollableState was an inherited widget.
// ScrollableState.build() always rebuilds its _ScrollableScope.
不過確實,_ScrollableScope 本身並不複雜,也就十來行程式碼,一看就能看懂,說白了,作為一個InheritedWidget
,其所做的事也就一件:儲存共享資料;
在這裡,其所共享的資料是ScrollableState
和ScrollPosition
;那麼問題來了,儲存共享這倆圖個啥呢?
共享的資料都用來幹了啥
1、首先是ScrollableState
;可以看到,其本身被提供使用的地方只有一處:
static ScrollableState? of(BuildContext context) {
final _ScrollableScope? widget = context.dependOnInheritedWidgetOfExactType<_ScrollableScope>();
return widget?.scrollable;
}
結合其呼叫位置,使用這個方法的用處無非兩種型別:
- 使用state中的資料,甚至是state本身,來進行一些判斷操作;
- 使用state中的position和physics來進行一些手勢動作計算,並更新position中的資訊;
2、另一個共享的資料有點意思:同樣還是 position;
那麼問題又來了:
為啥要單獨提供一個position出來,直接使用上面的ScrollableState中的position不就行了?或者說,這個position跟上面用state獲取的position難道有什麼不同麼?
這個問題我還沒想出答案,我猜測:該不會就是為了方便呼叫?講道理,_ScrollableScope 跟隨 ScrollableState 的生命週期,重建的時候也一起重建,postion 應該跟 state中的永遠保持一致才是,不至於有區別吧;
回正題,這個position 的作用是?
還記得之前提到的一個有點意思,用於延遲載入的判斷方法不,這個position就用在這裡:
``` static bool recommendDeferredLoadingForContext(BuildContext context) { final _ScrollableScope? widget = context.getElementForInheritedWidgetOfExactType<_ScrollableScope>()?.widget as _ScrollableScope?; if (widget == null) { return false; } return widget.position.recommendDeferredLoading(context); }
```
關於_ScrollableScope 本身的分析也就到這了;應該說,型別是InheritedWidget
都應該不會太複雜,本身也就提供共享資料而已;
重點是使用這些共享資料的;
- 【Flutter】小說閱讀器改版 —— 翻頁動畫(三)
- 【Flutter】小說閱讀器改版 (六)—— 在動畫播放中攔截手勢
- 【Flutter】小說閱讀器改版 (五)—— 整合ScrollActivity
- 【Flutter】小說閱讀器改版 (四)—— 讓ScrollActivity追蹤手勢最新位置
- 【Flutter】小說閱讀器改版 (三)—— 實現支援 Drag 的ScrollActivity
- 【Flutter】小說閱讀器改版 (二)—— 改進一下模擬翻頁的效果
- 【Flutter】小說閱讀器改版 (一)—— 模擬翻頁的思路優化
- 【Flutter】自定義ListView開發記錄(五)—— 提供手勢等資訊
- 【Flutter】自定義ListView開發記錄(四)—— 關於ParentData的設想和分析與簡單實踐
- 【Flutter】自定義ListView開發記錄(三)—— 處理HitTest手勢事件
- 【Flutter】自定義ListView開發記錄(二)——設計LayoutManager
- 【Flutter】自定義ListView開發記錄(一)——設計滑動效果的處理方式
- 【Flutter】熊孩子拆元件系列之拆ListView(十)—— 按自己的方式組裝修改ListView
- 【Flutter】熊孩子拆元件系列之拆ListView(九)—— AutomaticKeepAlive和KeepAlive
- 【Flutter】熊孩子拆元件系列之拆ListView(八)—— SliverList的運作機制
- 【Flutter】熊孩子拆元件系列之拆ListView(七)—— SliverList的基礎結構
- 【Flutter】熊孩子拆元件系列之拆ListView(六)—— SliverPadding
- 【Flutter】熊孩子拆元件系列之拆ListView(五)—— ViewPort
- 【Flutter】熊孩子拆元件系列之拆ListView(四)—— _ScrollableScope
- 【Flutter】熊孩子拆元件系列之拆ListView(三)—— GlowingOverscrollIndicator