首页 文章

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

提问于
浏览
9

我是新手扑动/飞镖,所以当我尝试制作应用程序时,我也试着理解为什么事情是某种方式 . 在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));
  }
}

问题:

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

  • 从我的理解 createState() 函数返回一个 State 类型的对象,所以 _YellowBirdState extends State 有意义,但为什么 YellowBird 传入 State 的泛型类?我的猜测它与 Yellowbird 扩展 StatefulWidget 类有关但不太确定 .

2 回答

  • 10

    原因有很多:

    • 小部件是不可变的 . 因为 StatefulWidget 扩展 Widget 因此它也必须是不可变的 . 将声明拆分为两个类允许 StatefulWidget 是不可变的, State 是可变的 .

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

    至于 class _MyStatefulState extends State<MyStateful> 的说明

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

  • 7
    • Flutter的一个主要设计决策是重新创建小部件很便宜,因此可以调用 build() 来在重大内容时重建小部件树的分支 . 这对于通过构造函数赋予其不可变值的无状态小部件非常有效 . 但有状态的小部件需要在构建之间保留它们的状态 . 在您的示例中,框架可以创建多个 YellowBird ,但它只创建一个 YellowBirdState . 每个新创建的 YellowBird 都被框架透明地连接到现有的 YellowBirdState .

    • State 的子类需要知道其Widget类型,以便编译器知道变量 widget 的类型 . 在 YellowBirdState 中,您可以使用 widget 来引用窗口小部件 . 如果 YellowBird 有成员变量 final String foo ,则编译器知道 widget.fooYellowBird 中名为foo的字符串 .

相关问题