StatefullWidget和StatelessWidget关于性能的区别是什么?

时间:2019-12-09 08:52:36

标签: flutter flutter-layout

如果仅在StatelessWidget上使用StatefullWidget,反之亦然,会对性能产生影响吗?

在我看来,我们仅使用StatefullWidget进行诸如使用setState()更新UI的操作,可以在initState()中设置一些代码并将其处理dispose()函数。因此,当我不需要这些东西时,请继续使用StatelessWidget

但是这两个最常用的小部件之间真正的性能影响是什么?

4 个答案:

答案 0 :(得分:3)

在性能方面,StatelessWidget与带有空白StatefulWidget的{​​{1}}几乎相同。

写作:

State

或:

class Example extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

不会对您的应用程序的性能产生任何明显的影响。

在此处使用class Example extends StatefulWidget { @override _ExampleState createState() => _ExampleState(); } class _ExampleState extends State<Example> { @override Widget build(BuildContext context) { return Container(); } } 确实确实获得了很小的收益。但这太小了:

它们之间的区别可以概括为调用一个空函数与不调用一个空函数。是的,但绝对没有关系。


原因是,StatelessWidgetStatefulWidget在内部的实现几乎相同。

StatelessWidget 确实具有StatelessWidget拥有的所有额外生命周期。 它具有“ initState” /“ dispose”。甚至是StatefulWidget! 它们只是不属于公共API的一部分。

答案 1 :(得分:0)

statelessstateful小部件之间的性能将会发生变化。

有状态小部件消耗内存的原因。

    使用State.setState或依赖InheritedWidgets
  • 窗口小部件通常会在应用程序的生存期内重建许多次,因此,将重建此窗口小部件的影响降至最低至关重要。 (它们也可以使用State.initState或State.didChangeDependencies并分配资源,但重要的是它们可以重建。)

参考:-Performance considerations

答案 2 :(得分:0)

什么是StatelessWidget?

  

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

性能注意事项

  

通常仅在以下三种情况下调用无状态小部件的构建方法:第一次将小部件插入树中,小部件的父级更改其配置时以及其InheritedWidget依赖于更改时。

示例代码

class MyWidget extends StatelessWidget {
  const MyWidget ({ Key key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return new Container(color: const Color(0xFF00BD3A));
  }
}

什么是StatefulWidget?

  

具有可变状态的小部件。

性能注意事项

  

这是StatefulWidgets的两个主要类别。

     

第一个是在State.initState中分配资源并将其在State.dispose中处置的资源,但它不依赖InheritedWidgets或调用State.setState。此类小部件通常在应用程序或页面的根部使用,并通过ChangeNotifiers,Streams或其他此类对象与子小部件通信。遵循这种模式的有状态的小部件相对便宜(就CPU和GPU周期而言),因为它们一旦构建就永远不会更新。因此,它们可能具有一些复杂且深入的构建方法。

     

第二个类别是使用State.setState或依赖于InheritedWidgets的小部件。这些通常在应用程序的生命周期内会多次重建,因此,将重建此类小部件的影响降至最低至关重要。 (它们也可以使用State.initState或State.didChangeDependencies并分配资源,但重要的是它们可以重建。)

示例代码

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));
  }
}

完整说明是given here

答案 3 :(得分:-1)

如果屏幕是静态的,我们将使用 StatelessWidget 低内存对象);当屏幕是动态的时,我们将使用 StatefulWidget (<相对于无状态,则为“强” 。

因此,这取决于用例。您也可以在无状态小部件中使用provider或bloc来更新小部件。

因此,如果您可以选择使用无状态,那么请不要在其中使用有状态。

Flutter尝试将自己设置为 60 FPS ,但是如果经常使用setState来进行大多数有状态小部件的设置,则可能会导致一些问题。另一方面,太多的无状态状态不会成为问题