Page是继承自Component,在buildPage时,由父类Component的_wrapper调用一个私有的_pageWidget,这个_pageWidget继承自StatefulWidget,它是根据传入的参数来构建的。
Component里的_wrapper是一个函数签名typedef WidgetWrapper = Widget Function(Widget child);
,Component初始化时接收传入的wrapper,如果wrapper为空,则使用一个默认的_wrapperByDefault作为wrapper,这个_wrapperByDefault单单的返回child,static Widget _wrapperByDefault(Widget child) => child;
Component类里自定义了createState()函数,返回一个继承自State的ComponentState,这个state是搭配着ComponentWidget的,继承自StatefulWidget。在Component的buildComponent方法内判断如果不是pureView会返回ComponentWidget。pureView的判断如下:
bool isPureView() {
return protectedReducer == null &&
protectedEffect == null &&
protectedDependencies == null;
}
pureView是不持有当前的component的,只有ComponentWidget持有当前的component
我们都知道在类似使用动画时要混入一个TickerProvider,是在State定义时with上去的,TickerProviderStateMixin是在State上的一个mixin,它是配套给StatefulWidget的state的生命周期使用的,在page里没有定义哪个方法可以取到_pageWidget的state,也没有暴露出相关createState方法,无法将其挂载到其私有的_pageState上,则可以重写父类Component那个自定义的createState方法,在这里混入,因为Component的createState方法,直接返回的就是ComponentState。ComponentState<T> createState() => ComponentState<T>();
而且与ComponentState搭配的ComponentWidget,其重写的createState方法,也是调用的这个ComponentState<T> createState() => component.createState();
但是这里仅仅是一个方法,要如何mixin呢,可以extends
ComponentState,在这上面mixin,然后createState里返回它就行了,后续就把它当state用即可,也不需要callSuper,它就是一个独立的ComponentState,继承自State,重写了build方法等一系列应该有的方法,而且只是混入,其他方法还是用父类ComponentState的。
建议搭配下一篇姊妹篇一起
各位大佬我是一个菜狗,如编写有误,还请帮忙指正,不胜感激
网友评论