Flutter中StatefulWidgets的目的?

时间:2018-06-03 08:37:00

标签: flutter

以下是StatefulWidget的示例。但它不仅仅是锅炉板代码吗?为什么我们需要两节课?通常你复制并粘贴extends StatefulWidget部分,但目的在哪里?有一些隐藏的功能吗?或者它是某种抽象级别?为什么这个设计是由Flutter团队选择的?

 class Counter extends StatefulWidget {
      int someVar;
      Counter(this.someVar);

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

这是州级。这课不足够吗?为什么我们需要一个StatefulWidget两个类?

class _CounterState extends State<Counter> {
  int _counter = 0;

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

  @override
  Widget build(BuildContext context) {
    return new Row(children: <Widget>[
      new CounterIncrementor(onPressed: _increment),
      new CounterDisplay(count: _counter),
    ]);
  }
}

2 个答案:

答案 0 :(得分:1)

因为所有Widgets都是不可变的。这意味着在这种情况下,您的Counter类是不可变的,因此所有变量都应该是final。但是,State不可变。

您可以查看the documentation about the Widget class以详细了解其用途。

  

窗口小部件是用户界面的一部分的不可变描述。 [...]小部件本身没有可变状态(所有字段都必须是最终的)。如果您希望将可变状态与窗口小部件相关联,请考虑使用StatefulWidget,它会在它被扩展为元素并合并到树中时创建一个State对象(通过StatefulWidget.createState)。

答案 1 :(得分:-1)

将有状态小部件分成两部分是一些颤动模式的要求。小部件是您在函数式编程中找到的纯函数的表示。

事实上,React,一个从中获取灵感的库也使用了两个独立的对象。使用以下语法时相当明显:

class MyComponent extends React.Component<Props, State> {
    state: State = {
       foo: 42,
    }
    ...
}

Okey,但为什么StateStateful子类深层链接?为什么我不能将任何课程用作State

啊,这是一个有趣的问题!对于那些曾经使用过反应的人来说,这是你可以做的事情。 React可以使用任何对象作为状态。颤动是如此相似,为什么我们不能呢?

毕竟,通过一些调整,没有什么能阻止以下语法,甚至没有@immutable标志:

class MyStateful extends StatefulWidget<Video> {
  @override
  void dispose() {}

  @override
  build(BuildContext context) {
    return new Text(state.title);
  }
}

为什么?

来自颤动的引用documentation

  

您可能想知道为什么StatefulWidget和State是单独的对象。在Flutter中,这两种类型的对象具有不同的生命周期。窗口小部件是临时对象,用于构造应用程序当前状态的表示。另一方面,状态对象在调用build()之间是持久的,允许它们记住信息。

这意味着我们将State移动到Stateful子类的所有生命周期方法覆盖。例如initState,还有disposedidUpdateWidget。考虑到小部件只是永不更新的可丢弃对象,这是没有意义的。