为什么Flutter State对象需要窗口小部件?

时间:2018-08-16 08:42:23

标签: dart flutter

该演示示例包含以下代码,这显然是Flutter应用程序的典型代码:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {...}
}

我很好,我猜想,MyHomePage覆盖了StatefulWidget createState方法。有点尴尬,但是到底呢?甚至取决于State子类。很好

但是然后让State子类转过来并依赖MyHomePage吗?我在将我相当丰富的智慧包装在那上面时遇到了麻烦。

因此,也许我不清楚State<MyHomePage>是什么。例如,Map<String, Object>的含义很明确:将字符串与对象相关联。有人可以说明一下吗?而且,如果您可以包括一些需要使用状态对象来扩展窗口小部件的信息,那么我将很乐于阅读。

2 个答案:

答案 0 :(得分:1)

这是为了使窗口小部件属性访问更加容易。

new MyStatefulWidget(foo: 42, bar: "string")

那么您很可能想从foo访问bar / State

如果没有这种语法,则必须键入自定义State构造函数,并将所有StatefulWidget子类属性传递给State内部的createState子类。基本上,您会得到:

class MyStatefulWidget extends StatefulWidget {
  final int foo;

  MyStatefulWidget({this.foo});

  @override
  MyStatefulWidgetState createState() => MyStatefulWidgetState(foo: foo);
}

class MyStatefulWidgetState extends State<MyStatefulWidget> {
  final int foo;

  MyStatefulWidgetState({this.foo});

  @override
  Widget build(BuildContext context) {
    return Container(

    );
  }
}

无聊。您必须两次编写StatefulWidget子类的所有字段。


使用当前语法;您不必这样做。您可以使用State字段直接访问widget中当前实例化的窗口小部件的所有属性。

class MyStatefulWidgetState extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    print(widget.foo);
    return Container();
  }
}

答案 1 :(得分:0)

在Flutter中,所有内容都是小部件,有两种类型的小部件:无状态和有状态。

无状态:不需要可变状态的小部件。

完整状态::具有 可变 状态的小部件。

这就是为什么所有Statefull小部件都依赖于State<T>的原因,因为它管理小部件中的更改(状态)。