以下是StatefulWidget的示例。但它不仅仅是锅炉板代码吗?为什么我们需要两节课?通常你复制并粘贴extends StatefulWidget
部分,但目的在哪里?有一些隐藏的功能吗?或者它是某种抽象级别?为什么这个设计是由Flutter团队选择的?
class Counter extends StatefulWidget {
int someVar;
Counter(this.someVar);
@override
_CounterState createState() => new _CounterState();
}
这是州级。这课不足够吗?为什么我们需要一个StatefulWidget两个类?
class _CounterState extends State<Counter> {
int _counter = 0;
void _increment() {
setState(() {
++_counter;
});
}
@override
Widget build(BuildContext context) {
return new Row(children: <Widget>[
new CounterIncrementor(onPressed: _increment),
new CounterDisplay(count: _counter),
]);
}
}
答案 0 :(得分:1)
因为所有Widgets
都是不可变的。这意味着在这种情况下,您的Counter
类是不可变的,因此所有变量都应该是final
。但是,State
不可变。
您可以查看the documentation about the Widget class以详细了解其用途。
窗口小部件是用户界面的一部分的不可变描述。 [...]小部件本身没有可变状态(所有字段都必须是最终的)。如果您希望将可变状态与窗口小部件相关联,请考虑使用StatefulWidget,它会在它被扩展为元素并合并到树中时创建一个State对象(通过StatefulWidget.createState)。
答案 1 :(得分:-1)
将有状态小部件分成两部分是一些颤动模式的要求。小部件是您在函数式编程中找到的纯函数的表示。
事实上,React,一个从中获取灵感的库也使用了两个独立的对象。使用以下语法时相当明显:
class MyComponent extends React.Component<Props, State> {
state: State = {
foo: 42,
}
...
}
Okey,但为什么State
和Stateful
子类深层链接?为什么我不能将任何课程用作State
?
毕竟,通过一些调整,没有什么能阻止以下语法,甚至没有@immutable
标志:
class MyStateful extends StatefulWidget<Video> {
@override
void dispose() {}
@override
build(BuildContext context) {
return new Text(state.title);
}
}
为什么?
来自颤动的引用documentation:
您可能想知道为什么StatefulWidget和State是单独的对象。在Flutter中,这两种类型的对象具有不同的生命周期。窗口小部件是临时对象,用于构造应用程序当前状态的表示。另一方面,状态对象在调用build()之间是持久的,允许它们记住信息。
这意味着我们将State
移动到Stateful
子类的所有生命周期方法覆盖。例如initState
,还有dispose
或didUpdateWidget
。考虑到小部件只是永不更新的可丢弃对象,这是没有意义的。