Понимание выполнения метода initState при возврате с помощью навигатора во Flutter

“Выполняется ли метод initState при возврате с помощью Navigator во Flutter?”

Введение
Во Flutter метод initState— это метод жизненного цикла, который выполняется, когда виджет с отслеживанием состояния вставляется в дерево виджетов. Он обычно используется для инициализации переменных, настройки подписок или выполнения любых других задач одноразовой настройки. Однако могут возникнуть ситуации, когда вы переходите на другой экран с помощью Navigator, а затем возвращаетесь на исходный экран. В таких случаях вы можете задаться вопросом, выполняется ли метод initStateснова или нет. В этой статье блога мы рассмотрим этот вопрос и приведем примеры кода для различных сценариев.

  1. Переход на другой экран и возврат
    Давайте начнем с простого примера: вы переходите на другой экран с помощью Navigator.push, а затем возвращаетесь с помощью Navigator.pop. В этом случае метод initStateне выполняется повторно при возвращении на исходный экран. Вот пример:
class ScreenA extends StatefulWidget {
  @override
  _ScreenAState createState() => _ScreenAState();
}
class _ScreenAState extends State<ScreenA> {
  @override
  void initState() {
    super.initState();
    print('initState executed');
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen A'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go to Screen B'),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => ScreenB()),
            );
          },
        ),
      ),
    );
  }
}
class ScreenB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen B'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go back'),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}

Выход:

initState executed
  1. Переход на другой экран и возврат с заменой
    В некоторых случаях вы можете использовать Navigator.pushReplacementдля перехода на другой экран и замены текущего экрана. В этом случае метод initStateне выполняется повторно при возвращении. Вот пример:
class ScreenA extends StatefulWidget {
  @override
  _ScreenAState createState() => _ScreenAState();
}
class _ScreenAState extends State<ScreenA> {
  @override
  void initState() {
    super.initState();
    print('initState executed');
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen A'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go to Screen B'),
          onPressed: () {
            Navigator.pushReplacement(
              context,
              MaterialPageRoute(builder: (context) => ScreenB()),
            );
          },
        ),
      ),
    );
  }
}
class ScreenB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen B'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go back'),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}

Выход:

initState executed
  1. Переход на другой экран и всплывающие окна до тех пор, пока
    Если вы перейдете на другой экран, используя Navigator.push, а затем всплывете до тех пор, пока не будет выполнено определенное условие, используя Navigator.popUntil>метод initStateвыполняется снова, когда вы возвращаетесь на исходный экран. Вот пример:
class ScreenA extends StatefulWidget {
  @override
  _ScreenAState createState() => _ScreenAState();
}
class _ScreenAState extends State<ScreenA> {
  @override
  void initState() {
    super.initState();
    print('initState executed');
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen A'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go to Screen B'),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => ScreenB()),
            );
          },
        ),
      ),
    );
  }
}
class ScreenB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen B'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go back'),
          onPressed: () {
            Navigator.popUntil(context, (route) => route.isFirst);
          },
        ),
      ),
    );
  }
}

Выход:

initState executed
initState executed

Заключение
В заключение, метод initStateне выполняется снова, когда вы возвращаетесь на экран с помощью методов Navigator.popили Navigator.pushReplacement.. Однако если вы перейдете на другой экран, а затем будете перемещаться до тех пор, пока не будет выполнено определенное условие, используя Navigator.popUntil, метод initStateбудет выполнен снова, когда вы вернетесь.