美文网首页
Flutter学习笔记

Flutter学习笔记

作者: 无东东 | 来源:发表于2019-12-16 17:34 被阅读0次

1.声明式UI思想

状态改变即刷新UI,而不关心改变具体哪个UI,有点像在命令式中所有属性变化时汇总到refreshView函数,但是在框架层面简化了代码量,创建UI与刷新UI等价(用户代码层面,内部实现还是有区别),用户只根据不同的状态来进行一次性描述(build)。

2.Widget & State

Widget:一切皆为widget,说的是面向用户编码层面,所有界面都由用户通过build widget来进行描述。但是在实现上,真正显示出来的UI皆非widget,widget仅为轻量化的描述属性(如布局、颜色、等)而不参与渲染流程。在widget首次创建时,会生成element和renderObject并插入树,widget被element持有。当状态改变再次进行build时,虽然用户返回了新的widget,但是会从已有树中的element进行比对(通过类型、顺序、key等),相同的UI则不会再次进行创建element和renderObject,这就是为何widget可以达到快速的销毁和创建而不影响性能,因为其只是最轻量化的描述,真正的实体和渲染控制其实并没有每次被销毁。
State:为何会有statefulWidget,为了储存数据。以为一切皆widget,而widget需要不停的销毁和重建,如果有较大的数据(如列表要展示数据)放在widget中,会非常影响性能,所以需要把数据放在state中被持续持有。所以这里有个注意点:widget中createState只会调用一次,state中的属性也只初始化一次,所以通过创建widget传值时,初始化之后再次build不会更新state中的属性,如果需要初始化之后继续更改刷新,state中调用setState时需要使用widget.xxx,而使用state中属性并没有改变。参考

3.何时使用statelessWidget,何时需要stateful?

一般教程会说需要状态变化时需要使用statefulWidget,其实这么说并不准确,比如为何Text经常会有文字的变化,而它是一个statelessWidget?其实根据上面第二条的理解可以解释:当属性值只是由外部赋予的,需要使用statelessWidget而不要自己储存;而控件自身内部操作而改变数据的,才需要使用statefulWidget,比如需要根据当前操作动态变化的页面。
为何ListView这种根据拖动事件改变自身显示效果的控件是statelessWidget?因为其build时实际返回的是Scrollable类,为StatefulWidget。各种按钮同样进行了封装,而如果想自定义按钮推荐使用RawMaterialButton,为statefulWidget通过state来改变其外观参考

相关文章

网友评论

      本文标题:Flutter学习笔记

      本文链接:https://www.haomeiwen.com/subject/lcrdnctx.html