首页 > 解决方案 > 为什么 Flutter State 对象需要一个 Widget?

问题描述

演示示例具有以下代码,这显然是 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>意思很清楚:将一个字符串与一个对象相关联。有人可以解释一下吗?如果你可以包含一些关于需要状态对象来扩展小部件的内容,我会喜欢阅读的。

标签: dartflutter

解决方案


这是为了使小部件属性访问更加容易。当你这样做

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

然后你很可能想从你的foo.barState

如果没有这样的语法,您必须键入自定义State构造函数并将所有StatefulWidget子类属性传递给Statesubclass inside 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();
  }
}

推荐阅读