我想从父状态小部件调用子小部件的initState()方法。
这是我的代码:
class ClassA extends StatefulWidget {
@override
_ClassAState createState() => _ClassAState();
}
class _ClassAState extends State<ClassA> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: <Widget>[
ClassB(),
InkWell(
child: Text('Call ClassB initState()'),
onTap: (){
setState(() {});
},
),
],
),
)
,
);
}
}
class ClassB extends StatefulWidget {
@override
_ClassBState createState() => _ClassBState();
}
class _ClassBState extends State<ClassB> {
@override
void initState() {
print('initState in ClassB');
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
height: 100,
child: Text('Class B'),
);
}
}
在上面我想从ClassA()调用ClassB initState()方法。但是在点击时,它仅调用类B的build方法,但我也想调用initState()。
答案 0 :(得分:0)
ClassA 和 ClassB 具有两种不同的内部状态。第一次运行时,将两个小部件插入到树中,以便调用每个 initState 。之后,如果在 ClassA 中调用 setState ,则将更改 ClassA 状态。如果您查看文档
https://api.flutter.dev/flutter/widgets/State/initState.html
在将该对象插入树中时调用。
框架将为每个State对象恰好调用一次此方法 它会创建。
重写此方法以执行依赖于 该对象插入树的位置(即, 上下文)或用于配置此对象的小部件上(即, 小部件)。
您可以看到 initState 只能被框架调用一次,因此一旦初始化 ClassB 的状态,它就不是正确的方法。正如Randal Schwartz建议的那样,您应该更改代码。你可以从这里开始