dart - 为什么 Flutter State 对象需要一个 Widget?
问题描述
演示示例具有以下代码,这显然是 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<MyHomePage>
是/做什么。比如说,Map<String, Object>
意思很清楚:将一个字符串与一个对象相关联。有人可以解释一下吗?如果你可以包含一些关于需要状态对象来扩展小部件的内容,我会喜欢阅读的。
解决方案
这是为了使小部件属性访问更加容易。当你这样做
new MyStatefulWidget(foo: 42, bar: "string")
然后你很可能想从你的foo
.bar
State
如果没有这样的语法,您必须键入自定义State
构造函数并将所有StatefulWidget
子类属性传递给State
subclass inside createState
。基本上你会有这样的:
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
两次编写子类的所有字段。
使用当前语法;你不必这样做。State
您可以使用widget
字段直接访问当前实例化的小部件的所有属性。
class MyStatefulWidgetState extends State<MyStatefulWidget> {
@override
Widget build(BuildContext context) {
print(widget.foo);
return Container();
}
}
推荐阅读
- routing - 使用外部内容过滤器时的后缀 always_bcc
- python - 根据 Python 中的条件返回字典中最大值的键
- php - laravel 的自动招摇文档
- angular - 如何在 Angular 5 应用程序中正确使用 Angular 百分比管道?
- node-red - 如何将 MQTT 数据发布到空白网页
- angular - 设置禁用离子输入的离子标签的不透明度
- android - 我应该在我的 (android) 应用程序中直接访问 FIWARE Orion 上下文代理 API 吗?
- angular - 编码的 url 没有以角度正确重定向,如何将编码的 url 路由到正确的地址?
- html - ngStyle 从对象/模型接收颜色的问题
- java - 如何在运行时映射表创建?