了解 StatefulWidget 在 Flutter 中的使用

Understanding the use of StatefulWidget in Flutter

我刚开始 fiddle 使用 Flutter,我无法理解 StatefulWidget 的意义。我在教程等中看到的任何地方所做的所有这些小部件都是实例化一个 State<MyWidget> 并让它完成所有工作。
例如,来自this(官方)教程:

class RandomWords extends StatefulWidget {
  @override
  createState() => new RandomWordsState();
}
class RandomWordsState extends State<RandomWords> {
  ...
}

我想知道的是为什么它是这样建造的,外层class有什么用(在我的例子中RandomWords)。

提前致谢。

据我了解,是为了保存widget的信息。所以每次你想保存一个变量或其他东西时,你都实现了 setState 。请参阅有关在 Flutter 中添加交互性的教程。

"outer class"final,每个小部件都是 final(不可变)。这意味着它的所有 属性 也必须是 final:

class RandomWords extends StatefulWidget {
  final String name;

  @override
  createState() => new RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  String name;

  @override
  void initState() {
    name = widget.name;
    super.initState();
  }

  @override
  Widget build(BuildContext context) => Text(name);

  void someMethod() {
    print(widget.name);
    setState(() => name = 'new name');
  }
}

来自State的所有字段 StatefulWidget 可以访问,显然 没有 更改 因为它们是 final.

但是,

State 可以更改数据setState 将执行其回调,然后 rebuild State (与新数据)。

StatelessWidget's 也可以重建,即当它的父级正在重建时,但所有状态都丢失并且没有数据被保留。这就是 State 的用途。

在 Flutter 中构建 UI,我们使用两种主要类型的 widget,StatelessWidgetStatefulWidget。 stateful当小部件的值(状态)发生变化或具有可以随时间变化的可变状态时使用小部件。

有状态 小部件的一些重要属性

  • 有状态小部件是可变的。它跟踪状态。
  • Stateful widget 的 build() 方法被多次调用。
  • 它在其生命周期中重建了数次。

一些 有状态 小部件的示例

  • 复选框:无论复选框是否被选中都保持其状态。

  • Radio:无论是否选中都保持其状态。

    class MyStatefulWidget extends StatefulWidget {
    @override
    _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
      }
    
    class _MyStatefulWidgetState extends State<MyStatefulWidget> {
    @override
    Widget build(BuildContext context) {
    return Container();
    }
    }
    

状态小部件使用两个 class 声明,StatefulWidget classState class。 StatefulWidgetclass在widget的配置改变时重建,但是Stateclass可以持久化(remain)。

例如,当状态改变时,widget被重建。如果从树中移除 StatefulWidget,然后在一段时间后将其重新插入到树中,则会创建一个新的 State 对象。

stateless widget 就像常量显示, 喜欢只展示一些东西 stateful 用于可变显示,我的意思是如果该屏幕中的任何值必须更改,那么它应该是有状态的