Page是繼承自Component,在buildPage時(shí),由父類(lèi)Component的_wrapper調(diào)用一個(gè)私有的_pageWidget,這個(gè)_pageWidget繼承自StatefulWidget,它是根據(jù)傳入的參數(shù)來(lái)構(gòu)建的。
Component里的_wrapper是一個(gè)函數(shù)簽名typedef WidgetWrapper = Widget Function(Widget child);,Component初始化時(shí)接收傳入的wrapper,如果wrapper為空,則使用一個(gè)默認(rèn)的_wrapperByDefault作為wrapper,這個(gè)_wrapperByDefault單單的返回child,static Widget _wrapperByDefault(Widget child) => child;
Component類(lèi)里自定義了createState()函數(shù),返回一個(gè)繼承自State的ComponentState,這個(gè)state是搭配著ComponentWidget的,繼承自StatefulWidget。在Component的buildComponent方法內(nèi)判斷如果不是pureView會(huì)返回ComponentWidget。pureView的判斷如下:
bool isPureView() {
return protectedReducer == null &&
protectedEffect == null &&
protectedDependencies == null;
}
pureView是不持有當(dāng)前的component的,只有ComponentWidget持有當(dāng)前的component
我們都知道在類(lèi)似使用動(dòng)畫(huà)時(shí)要混入一個(gè)TickerProvider,是在State定義時(shí)with上去的,TickerProviderStateMixin是在State上的一個(gè)mixin,它是配套給StatefulWidget的state的生命周期使用的,在page里沒(méi)有定義哪個(gè)方法可以取到_pageWidget的state,也沒(méi)有暴露出相關(guān)createState方法,無(wú)法將其掛載到其私有的_pageState上,則可以重寫(xiě)父類(lèi)Component那個(gè)自定義的createState方法,在這里混入,因?yàn)镃omponent的createState方法,直接返回的就是ComponentState。ComponentState<T> createState() => ComponentState<T>(); 而且與ComponentState搭配的ComponentWidget,其重寫(xiě)的createState方法,也是調(diào)用的這個(gè)ComponentState<T> createState() => component.createState();
但是這里僅僅是一個(gè)方法,要如何mixin呢,可以extends ComponentState,在這上面mixin,然后createState里返回它就行了,后續(xù)就把它當(dāng)state用即可,也不需要callSuper,它就是一個(gè)獨(dú)立的ComponentState,繼承自State,重寫(xiě)了build方法等一系列應(yīng)該有的方法,而且只是混入,其他方法還是用父類(lèi)ComponentState的。
建議搭配下一篇姊妹篇一起
各位大佬我是一個(gè)菜狗,如編寫(xiě)有誤,還請(qǐng)幫忙指正,不勝感激