Как setState () перестраивает дочерние виджеты? - PullRequest
1 голос
/ 09 апреля 2019

Мне просто нужно некоторое представление о том, как развевающиеся виджеты с состоянием формируют своих потомков с состоянием при вызове setState (). Пожалуйста, посмотрите на код ниже.

class MyStatefulWidget extends StatefulWidget {
  MyStatefulWidget({Key key}) : super(key: key);

  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  Widget build(BuildContext context) {
    print("Parent build method invoked");
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StatefulChild(), // Keeping this line gives the output 1
            statefulChild, // Keeping this line gives the output 2
            RaisedButton(
              child: Text('Click me'),
              onPressed: () {
                setState(() {});
              },
            )
          ],
        ),
      ),
    );
  }

  StatefulChild statefulChild = StatefulChild();
}

class StatefulChild extends StatefulWidget {
  StatefulChildState createState() => StatefulChildState();
}

class StatefulChildState extends State<StatefulChild> {
  @override
  Widget build(BuildContext context) {
    print("Child00 build method invoked");
    return Container();
  }
}

Когда нажата кнопка Raised,

Выход 1 // Сохранение только StatefulChild(),

I/flutter ( 2903): Parent build method invoked
I/flutter ( 2903): Child00 build method invoked

Выход 2 // Сохранение только statefulChild,

I/flutter ( 2903): Parent build method invoked

Какая здесь разница? Что происходит под капотом? Подробное объяснение высоко ценится.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Когда дерево виджетов перестраивается, Flutter сравнивает, используя == предыдущий и новый виджет, возвращенный методом build.

В этой ситуации существует два сценария:

  • == - false.В этом случае Flutter будет сравнивать runtimeType & key, чтобы узнать, должно ли быть сохранено состояние предыдущего виджета.Затем Флаттер вызывает build для этого виджета

  • ==, равный true.В этом случае Flutter прерывает построение дерева виджетов (иначе он не будет вызывать build).

Эта оптимизация возможна благодаря неизменности виджетов.

Поскольку виджеты неизменны, если == не изменилось, это означает, что обновлять нечего.Поэтому Flutter может безопасно оптимизировать это.

0 голосов
/ 09 апреля 2019

Когда вы используете setState(()), будет вызываться только build().Теперь в этом методе вы снова вызываете StatefulChild() (первая строка), который дополнительно создает экземпляр этого класса, чтобы выполнить метод build() этого класса.

Но когда вы используете statefulChild, он не создает новый экземпляр, потому что

StatefulChild statefulChild = StatefulChild();

используется вне метода build().Так что это просто позвонили однажды.

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