如何在Flutter中从父窗口小部件调用子窗口小部件的initState()方法

时间:2020-11-04 09:58:48

标签: flutter dart flutter-layout state bloc

我想从父状态小部件调用子小部件的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()。

1 个答案:

答案 0 :(得分:0)

ClassA ClassB 具有两种不同的内部状态。第一次运行时,将两个小部件插入到树中,以便调用每个 initState 。之后,如果在 ClassA 中调用 setState ,则将更改 ClassA 状态。如果您查看文档

https://api.flutter.dev/flutter/widgets/State/initState.html

在将该对象插入树中时调用。

框架将为每个State对象恰好调用一次此方法 它会创建。

重写此方法以执行依赖于 该对象插入树的位置(即, 上下文)或用于配置此对象的小部件上(即, 小部件)。

您可以看到 initState 只能被框架调用一次,因此一旦初始化 ClassB 的状态,它就不是正确的方法。正如Randal Schwartz建议的那样,您应该更改代码。你可以从这里开始

https://flutter.dev/docs/development/ui/interactive