为啥在 StatefulWidget 中没有定义 build 方法?
Posted
技术标签:
【中文标题】为啥在 StatefulWidget 中没有定义 build 方法?【英文标题】:Why build method isn't defined inside StatefulWidget?为什么在 StatefulWidget 中没有定义 build 方法? 【发布时间】:2019-12-22 09:40:15 【问题描述】:我目前正在学习 Flutter。我试图深入研究 Flutter Widget 的生命周期,我想知道为什么 StatefulWidget
是这样写的:
class Example extends StatefulWidget
@override
_ExampleState createState() => _ExampleState();
class _ExampleState extends State<Example>
// initState
// setState
// ...
@override
Widget build(BuildContext build)
...
但不是:
class Example extends StatefulWidget
// initState
// setState
// ...
@override
Widget build(BuildContext build)
...
我认为后者使来源变得简单。但我不知道他们为什么使用前一种风格?
【问题讨论】:
感谢 Mazin 先生的编辑 官方回答:github.com/flutter/flutter/issues/8794 【参考方案1】:StatefulWidget
使用单独的State
类而不在其主体中包含build
方法的原因是因为Widget
中的所有字段都是不可变的,这包括其所有子类。
您可能已经注意到 StatelessWidget
有它的 build
以及其中定义的其他相关方法,但由于 的性质,这是可能的StatelessWidget
完全使用提供的信息呈现,并且预计其 State
未来不会有任何变化。
对于StatefulWidget
,State
信息在应用过程中偶尔会发生变化(或预期会发生变化),因此这些信息不会适合存储在最终字段 (build
) 中以满足 Widget
类条件(所有字段都是不可变的)。这就是引入 State
类的原因。您只需要重写 createState
函数,将您定义的 State
附加到您的 StatefulWidget
,然后让所有这些变化发生在一个单独的类中。
【讨论】:
这也可能是因为有状态小部件的状态不仅仅是数据元素,还有 UI 元素。这意味着,有状态的小部件可能会显示一个文本字段,并且在状态更改时,它可能会显示两个文本字段。所以基本上,在状态发生变化时,小部件的 UI 也可能会发生变化,而不仅仅是数据。注意:我真的不知道这是不是真的。我只是在寻找更多的澄清。以上是关于为啥在 StatefulWidget 中没有定义 build 方法?的主要内容,如果未能解决你的问题,请参考以下文章
“没有引用声明‘setState’。” StatefulWidget 中 DropdownButton 的警告