【Flutter】熊孩子拆元件系列之拆ListView(四)—— _ScrollableScope

語言: CN / TW / HK

theme: condensed-night-purple

小知識,大挑戰!本文正在參與「程式設計師必備小知識」創作活動

本文已參與 「掘力星計劃」 ,贏取創作大禮包,挑戰創作激勵金。

前言

按照順序,上次分析了 GlowingOverscrollIndicator ,雖然那東西難度不大,不過作為組合型Widget,其本身在Widget樹中佔了不少;

所以去掉相關的部分,接下來分析的是:_ScrollableScope

目錄

https://juejin.cn/post/7016538861580845063

同樣的慣例,先看註釋,概念分析

不過呢,這回註釋就短短兩行:

// Enable Scrollable.of() to work as if ScrollableState was an inherited widget. // ScrollableState.build() always rebuilds its _ScrollableScope.

不過確實,_ScrollableScope 本身並不複雜,也就十來行程式碼,一看就能看懂,說白了,作為一個InheritedWidget ,其所做的事也就一件:儲存共享資料;

在這裡,其所共享的資料是ScrollableStateScrollPosition;那麼問題來了,儲存共享這倆圖個啥呢?

共享的資料都用來幹了啥

1、首先是ScrollableState ;可以看到,其本身被提供使用的地方只有一處:

static ScrollableState? of(BuildContext context) { final _ScrollableScope? widget = context.dependOnInheritedWidgetOfExactType<_ScrollableScope>(); return widget?.scrollable; }

結合其呼叫位置,使用這個方法的用處無非兩種型別:

  1. 使用state中的資料,甚至是state本身,來進行一些判斷操作;
  2. 使用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都應該不會太複雜,本身也就提供共享資料而已;

重點是使用這些共享資料的;

「其他文章」