一尘不染

为什么有状态的窗口小部件在flutter中定义为两个类?

flutter

我不熟悉Flutter / Dart,因此在尝试制作应用程序时,我还尝试理解为什么事情是特定的。在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));
  }
}

问题:

  1. 为什么用两个类而不是一个类来定义它们?我猜State类可以在其他地方使用,所以最好拆分。

  2. 据我了解,该createState()函数返回一个类型的对象State,因此_YellowBirdState extends State有意义,但是为什么将其YellowBird传递给的泛型类State呢?我的猜测与Yellowbird扩展StatefulWidget类有关,但不确定。


阅读 264

收藏
2020-08-13

共1个答案

一尘不染

有多种原因:

  • 小部件是不可变的。由于StatefulWidget扩展Widget,因此它也必须是不变的。将声明分为两个类可以使它们既StatefulWidget不变又 State可变。

  • 使用语法实例化窗口小部件new MyWidget()。如果我们将两个类合并为一个,new MyWidget()则每次其父级更新时,都会重置该状态的所有属性。

至于解释 class _MyStatefulState extends State<MyStateful>

那是因为State该类可以Stateful使用该this.widget字段访问它的一部分。泛型在这里使该类型的字段MyStateful而不是just
StatefulWidget。您可能要访问MyStateful属性。

2020-08-13