flutter - 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();
});
}
}
解决方案
出于性能原因使用不变性。如果小部件需要更改,请创建一个相应设置的新实例。检查两个实例是否相同比检查它们的状态是否相同更快。
推荐阅读
- angular - Angular 表单一次显示一条错误消息
- knockout.js - Dynamic Add New Row Using knockout js
- node.js - 在 NestJS 中为 Pug 设置“basedir”选项
- docker - 如何在 dockerfile 中使用 .ENV 文件中的变量?
- c - printf("%d","%u","%p",ptr,ptr,ptr) 和 printf("%d %u %p",ptr,ptr,ptr) 有什么区别?
- http - 如何查看单击 HTML 按钮时发出的 POST 请求的地址?
- postgresql - 几何类型从数据库中读取为字符串
- swift - 为信用卡输入格式化 NSTextField,例如 (xxxx xxxx xxxx xxxx) [macOS Swift]
- sqlite - 在 SQLite 中使用过滤器和分页查询多对多关系
- php - 致命错误:未捕获的 PDOException:使用 Google Cloud SQL 实例连接