该演示示例包含以下代码,这显然是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>
的含义很明确:将字符串与对象相关联。有人可以说明一下吗?而且,如果您可以包括一些需要使用状态对象来扩展窗口小部件的信息,那么我将很乐于阅读。
答案 0 :(得分:1)
这是为了使窗口小部件属性访问更加容易。
new MyStatefulWidget(foo: 42, bar: "string")
那么您很可能想从foo
访问bar
/ State
。
如果没有这种语法,则必须键入自定义State
构造函数,并将所有StatefulWidget
子类属性传递给State
内部的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();
}
}
答案 1 :(得分:0)
在Flutter中,所有内容都是小部件,有两种类型的小部件:无状态和有状态。
无状态:不需要可变状态的小部件。
完整状态::具有 可变 状态的小部件。
这就是为什么所有Statefull小部件都依赖于State<T>
的原因,因为它管理小部件中的更改(状态)。