1.3.3 三个基础知识QA
Q:组件的状态是什么?怎么理解StatefulWidget和StatelessWidget的关系?
A:状态就是一个事物的外在表征。由于Widget属性的不可变性,一个StatelessWidget对象具有唯一的界面展现效果。不过你可以通过属性值来决定它的表现,比如是用红色的文字还是蓝色的文字,你可以在使用时进行指定。StatefulWidget依赖于一个State对象进行界面呈现。更改状态量后,可以通过setState对当前组件进行更新。而且State对象有一套完整的生命周期回调,这能提供很多可操作性。
拿Material按钮一族来说,点击按钮时会有一些响应效果,如阴影、水波纹、高亮色等。但MaterialButton是StatelessWidget,似乎并没有改变自身表现的能力。其实MaterialButton本身的构建依赖于RawMaterialButton,而它是StatefulWidget,在RawMaterialButton的状态类中处理了响应的效果变化,再提供回调给外界使用。
按钮点击响应效果的状态更改逻辑是比较复杂的,通过RawMaterialButton组件封装后会使开发者的使用更简便,MaterialButton相当于外层的进一步封装,彻底让RawMaterialButton“深藏功与名”。其实StatefulWidget或StatelessWidget都只是Flutter的一块积木而已,想要控制组件的表现变化或得到State生命周期,需要StatefulWidget助你一臂之力。
Q:@immutable、@mustCallSuper、@required是什么?
A:这是定义在meta.dart中的注解,开发者不可能逐个对使用者说“这个属性必须写”,这个类中的字段最好都是常量,这个方法最好先调用一下父类方法。注解的作用也就是便于开发者或者开源者向使用者传达一些要点,这些要点可以统一用注解标注一下。如果看到一个类顶层有@immutable,那么强烈建议该类及其衍生类中的属性值是常量。
相当于开发者大牛说:“我已经用注解说得这么清楚了,不遵守的话,出了错误可别怪我。”
然后IDE一想:“那些APIcaller也不一定认真看,那我好人做到底,如果他们不遵守用法,我就给个提示吧。我只能帮你到这了,你还不遵守,出了错我也没办法……”
Q:在AS里查看Android代码怎么会飘红,该怎么办?
A:其实一个跨平台Flutter项目包括三个项目,即Flutter项目、Android项目、iOS项目。一开始打开的是Flutter项目,Android/iOS项目只是在其内而已。该项目并不符合Android的标准样式,所以AS找不到SDK就一脸懵,不知如何是好就飘红了。解决方法是点击右上角的Open for Editing in Android Studio,打开Android项目。
在Flutter项目里打开iOS文件夹,但AS不认识它所以连高亮都不显示,将它当作普通文件夹处理。同样,可以在右上角的Xcode里打开。Flutter项目本身并不关心平台,与平台的联系都通过插件来完成。一旦套上跨平台的紧箍咒,那就需要关注Android项目和iOS项目,所以在学习插件前,这两个项目几乎可以看作透明的。