Flutter 学习基础总结(widget篇)

  目前想解读下getX的源码,但是后来发现需要对flutter原生的刷新以及绘制过程有所了解才可以更好的去理解getX的源码,所以,才有了这个文章,但是这个仅供本人自己学习总结的,所以有啥描述不对或者不太好的地方请大家指出,感谢!!!

而且推荐下这个网址的作者写得十分不错,作者是zxfcumtcs,网址:https://zxfcumtcs.github.io/2020/05/01/deepinto-flutter-widget/

Widget篇:

widget 根据功能性分为了三类:
1、Component Widget--组合类Widget:
这类 Widget 都直接或间接继承于StatelessWidget或StatefulWidget,也是成为组合类,其实我们一直叫做page的也就是widget组合起来的。

2、Proxy Widget--代理类Widget:
这个主要是InheritedWidget和ParentDataWidget,这个是代理类,ParentDataWidget主要用配置Descendant Renderer Widget的布局信息,而InheritedWidget用于在「Descendant Widgets」间传递共享信息

3、Renderer Widget--渲染类Widget:

主要看到的页面都是通过这个widget显示的,而且Component Widget和Proxy Widget并不会直接显示,都是通过Renderer Widget来进行显示,而且这 3 类 Widget 中,只有「Renderer Widget」有与之一一对应的「Render Object」

widget的三个重要条件:

1、key——在同一个父节点下,作为兄弟节点的唯一标识,可以通过GlobalKey来获取对应的widget的状态,这样就可以调用widget中的方法

2、element creatElement()--每个widget都是通过这个方法来创建对应的element,注意:一个widget可以多个element的实例

3、static bool canUpdate(Widget oldWidget, Widget newWidget) --通过这个方法来判断执行,前一帧的是更新还是新建element进行替换(判断条件是:2个Widget的runtimeType与key都相等时,返回true,即可以直接更新 (key 为 null 时,认为相等))

widget、state、element三者之间的关系:
widget在creatElement()的时候创建出对应的element,而state是存在于直接继承statefulwidget的,而要记住widget都是不可变的,而state也是不可变的,但是state的内部是可变的,也有对应的生命周期(具体看上面的文章引用的widget),而state的实例是通过StatefulElement.constructor –> StatefulWidget.createState创建的。

Proxy Widget需要了解下:

1、ParentDataWidget:配置父节点的信息,当ParentDataWidget中的parentData的信息更新的时候,他的字节点(RenderObejctWidget,因为最终的体现的都是在RenderObejctWidget上的)也会rebuild

2、InheritedWidget:如果字节点所以来的InheritedWidget发生了改变也会rebuild(通过这个办法:bool updateShouldNotify(covariant InheritedWidget oldWidget) —— 在「Inherited Widget」rebuilt 时判断是否需要 rebuilt 那些依赖它的 Widget)

然后最重要的是RenderObjectWidget,因为ParentDataWidget和InheritedWidget的改变最终还是在RenderObjectWidget上体验出来:

RenderObjectElement createElement() ——「RenderObject Widget」对应的 Element 为RenderObjectElement,由于RenderObjectElement也是抽象类,故子类需要重写该方法;

RenderObject createRenderObject(BuildContext context) —— 核心方法,创建 Render Widget 对应的 Render Object,同样子类需要重写该方法;

void updateRenderObject(BuildContext context, covariant RenderObject renderObject) —— 核心方法,在 Widget 更新后,修改对应的 Render Object。该方法在首次 build 以及需要更新 Widget 时都会调用;

你可能感兴趣的:(Flutter 学习基础总结(widget篇))