【问题标题】:Why does Flutter State object require a Widget?为什么 Flutter State 对象需要一个 Widget?
【发布时间】:2018-08-16 08:42:23
【问题描述】:

演示示例具有以下代码,这显然是 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&lt;MyHomePage&gt; 是/做什么。例如,Map&lt;String, Object&gt; 的含义很明确:将字符串与对象相关联。有人可以解释一下吗?如果你可以包含一些关于需要状态对象来扩展小部件的内容,我会喜欢阅读。

【问题讨论】:

标签: dart flutter


【解决方案1】:

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

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

那么您很可能希望从您的State 访问foo/bar

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

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子类的所有字段都要写两次。


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

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

【讨论】:

  • 小部件子类只有 包含 状态,我可以。为什么我们不能这样做?
  • 你的意思是,为什么这里不仅仅是数据?为什么会有build之类的?
  • 必须State 也有build
  • 我想你误解了State 在 Flutter 中的含义。这是一个小部件的状态。不是您的应用程序的状态。这就是为什么在State 上有didUpdateWidgetdispose 这样的方法。
  • @TomRussell 如果你想存储实际的应用程序状态,InheritedWidget 是你想要的更多。并且那个并不强制“状态”依赖于视图
【解决方案2】:

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

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

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

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

【讨论】:

  • 这并不是他真正要求的。他想知道为什么State&lt;T&gt;,为什么不只是State
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2014-01-08
  • 2019-10-29
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多