Flutter-新的StatefullWidget,为什么未调用相关的createState()方法?

问题描述 投票:0回答:3

在'TestPageState'中,我放了一个按钮来调用'setState'方法。新的TestChildWidget()将创建一个新的TestChildWidget,默认构造函数TestChildWidget()被调用,但是为什么不调用TestChildWidget中的'createState()'方法呢?

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: new TestPage()
    );
  }
}

class TestPage extends StatefulWidget{
  TestPageState createState(){
    print('TestPageState createState');

    return new TestPageState();
  }
}
class TestPageState extends State<TestPage>{

  @override
  Widget build(BuildContext context) {
    print('TestPageState Build');

      // TODO: implement build
      return Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new TestChildWidget(),
          RaisedButton(
            child: Text("刷新"),
            onPressed: () => setState(() => print('setState')), //build method will called, new TestChildWidget() will be called
          )
        ],
      );
  }
}

class TestChildWidget extends StatefulWidget{
  TestChildWidget(){
     //new TestChildWidget(), this default construtor will be called, but why createState() not called?
  }
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    print('TestChildWidget createState');

    return new TestChildWidgetState();
  }

}

class TestChildWidgetState extends State<TestChildWidget>{
  @override
  Widget build(BuildContext context) {
    print('TestChildWidgetState build');

    // TODO: implement build
    return Text('1111');
  }
}

在'TestPageState'中,我放了一个按钮来调用'setState'方法。新的TestChildWidget()将创建一个新的TestChildWidget,默认构造函数TestChildWidget()被调用,但是为什么不调用TestChildWidget中的'createState()'方法呢?

flutter dart mobile
3个回答
0
投票

创建状态或在创建状态时调用状态build

class TestChildWidgetState extends State<TestChildWidget>{
  TestChildWidgetState(){
    print("Created only once");
  }
}

该框架在对StatefulWidget进行充气时会调用createState,这意味着如果该StatefulWidget已在多个位置插入到树中,则可能会将多个State对象与同一StatefulWidget关联。同样,如果将StatefulWidget从树中删除并随后再次插入到树中,则框架将再次调用createState来创建新的State对象,从而简化State对象的生命周期。参见StatefulWidget


0
投票

print(...)日志可能无法打印到控制台,但Flutter已调用createState()

您可以尝试使用:

developer.debugger(when: true); 

createState()


0
投票

调用setState()时,它将调用

abstract class Widget extends DiagnosticableTree {
  const Widget({ this.key });
  final Key key;
  ···
  static bool canUpdate(Widget oldWidget, Widget newWidget) {
    return oldWidget.runtimeType == newWidget.runtimeType
        && oldWidget.key == newWidget.key;
  }
}

如果canUpdate()返回true,则意味着无需创建新元素。

© www.soinside.com 2019 - 2024. All rights reserved.