Flutter - новый StatefullWidget, почему связанный метод createState () не вызывается? - PullRequest
0 голосов
/ 06 марта 2020

в «TestPageState» я положил кнопку для вызова метода «setState». new TestChildWidget () создаст новый TestChildWidget, вызывается конструктор по умолчанию TestChildWidget (), но почему не вызывается метод createState () в TestChildWidget?

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». new TestChildWidget () создаст новый TestChildWidget, вызывается конструктор по умолчанию TestChildWidget (), но почему не вызывается метод createState () в TestChildWidget?

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

print (...) log возможно не печатать на консоль, но Flutter вызвал createState ()

Вы можете попробовать использовать:

developer.debugger(when: true); 

in createState ()

0 голосов
/ 06 марта 2020

Когда вызывается 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, это означает, что нет необходимости создавать новый элемент.

0 голосов
/ 06 марта 2020

Создает состояние или вызывает состояние build при создании состояния.

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

Фреймворк вызывает createState всякий раз, когда он раздувает StatefulWidget, что означает, что с объектом может быть связано несколько объектов State. тот же StatefulWidget, если этот виджет был вставлен в дерево в нескольких местах. Аналогичным образом, если StatefulWidget удаляется из дерева, а затем снова вставляется в дерево, платформа снова вызовет createState, чтобы создать объект State fre sh, упрощая жизненный цикл объектов State. См. StatefulWidget

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...