为啥在 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 未来不会有任何变化。

对于StatefulWidgetState信息在应用过程中偶尔会发生变化(或预期会发生变化),因此这些信息不会适合存储在最终字段 (build) 中以满足 Widget 类条件(所有字段都是不可变的)。这就是引入 State 类的原因。您只需要重写 createState 函数,将您定义的 State 附加到您的 StatefulWidget,然后让所有这些变化发生在一个单独的类中。

【讨论】:

这也可能是因为有状态小部件的状态不仅仅是数据元素,还有 UI 元素。这意味着,有状态的小部件可能会显示一个文本字段,并且在状态更改时,它可能会显示两个文本字段。所以基本上,在状态发生变化时,小部件的 UI 也可能会发生变化,而不仅仅是数据。注意:我真的不知道这是不是真的。我只是在寻找更多的澄清。

以上是关于为啥在 StatefulWidget 中没有定义 build 方法?的主要内容,如果未能解决你的问题,请参考以下文章

“没有引用声明‘setState’。” StatefulWidget 中 DropdownButton 的警告

flutter自定义控件 - StatefulWidget获取当前State

为啥Flutter Hooks没有受到太多关注和青睐?

StatefulWidget

Flutter StatefulWidget 没有被重建

StatefulBuilder 与 StatefulWidget