我是新手扑动/飞镖,所以当我尝试制作应用程序时,我也试着理解为什么事情是某种方式 . 在flutter文档中,有一个有状态小部件的示例代码,如下所示:
class YellowBird extends StatefulWidget {
const YellowBird({ Key key }) : super(key: key);
@override
_YellowBirdState createState() => new _YellowBirdState();
}
class _YellowBirdState extends State<YellowBird> {
@override
Widget build(BuildContext context) {
return new Container(color: const Color(0xFFFFE306));
}
}
问题:
-
为什么他们用两个类而不是一个类定义?我猜测State类可以在其他地方使用,所以最好分开 .
-
从我的理解
createState()
函数返回一个State
类型的对象,所以_YellowBirdState extends State
有意义,但为什么YellowBird
传入State
的泛型类?我的猜测它与Yellowbird
扩展StatefulWidget
类有关但不太确定 .
2 回答
原因有很多:
小部件是不可变的 . 因为
StatefulWidget
扩展Widget
因此它也必须是不可变的 . 将声明拆分为两个类允许StatefulWidget
是不可变的,State
是可变的 .使用语法
new MyWidget()
实例化小部件 . 如果我们将两个类合并为一个,new MyWidget()
将在每次父更新时重置该状态的所有属性 .至于
class _MyStatefulState extends State<MyStateful>
的说明那是因为
State
类可以使用this.widget
字段访问它的Stateful
部分 . 泛型在这里使MyStateful
类型的字段而不仅仅是StatefulWidget
. 您可能想要访问MyStateful
属性 .Flutter的一个主要设计决策是重新创建小部件很便宜,因此可以调用
build()
来在重大内容时重建小部件树的分支 . 这对于通过构造函数赋予其不可变值的无状态小部件非常有效 . 但有状态的小部件需要在构建之间保留它们的状态 . 在您的示例中,框架可以创建多个YellowBird
,但它只创建一个YellowBirdState
. 每个新创建的YellowBird
都被框架透明地连接到现有的YellowBirdState
.State
的子类需要知道其Widget类型,以便编译器知道变量widget
的类型 . 在YellowBirdState
中,您可以使用widget
来引用窗口小部件 . 如果YellowBird
有成员变量final String foo
,则编译器知道widget.foo
是YellowBird
中名为foo的字符串 .