首页 > 解决方案 > StatefulWidget 中的 Flutter 状态而不是 State 的危险?

问题描述

我知道 StatefulWidget 子类旨在是不可变的,并且我们倾向于将状态存储在 State 子类中。(这里不讨论高级状态管理技术。)

那么,将我们的模型/状态存储在 StatefulWidget 类而不是 State 类中的危险是什么?既然 State 实例有一个widget引用 StatefulWidget 的属性,为什么不把状态存储在那里呢?

例如:

class Foo extends StatefulWidget {

  int count = 0; // state

  State createState() => FooState();
}

class FooState extends State<Foo> {

  Widget build(BuildContext context) {
    return Column(children:[
      Text(widget.count.toString()),
      FloatingActionButton(
        onPressed: doIt
      )
    ]);
  }

  void doIt() {
    setState( () {
      widget.count += 1;
    });
  }

}

当 state 是一个对象并传递给 State 实例时,这些担忧是否仍然适用?

例如:

class Foo extends StatefulWidget {

  final counter = Counter(0); // state

  State createState() => FooState(counter);
}

class FooState extends State<Foo> {

  final counter;

  FooState(this.counter);

  Widget build(BuildContext context) {
    return Column(children:[
      Text(counter.stringValue()),
      FloatingActionButton(
        onPressed: doIt
      )
    ]);
  }

  void doIt() {
    setState( () {
      counter.increment();
    });
  }

}

标签: flutter

解决方案


出于性能原因使用不变性。如果小部件需要更改,请创建一个相应设置的新实例。检查两个实例是否相同比检查它们的状态是否相同更快。


推荐阅读