“Выполняется ли метод initState при возврате с помощью Navigator во Flutter?”
Введение
Во Flutter метод initState— это метод жизненного цикла, который выполняется, когда виджет с отслеживанием состояния вставляется в дерево виджетов. Он обычно используется для инициализации переменных, настройки подписок или выполнения любых других задач одноразовой настройки. Однако могут возникнуть ситуации, когда вы переходите на другой экран с помощью Navigator, а затем возвращаетесь на исходный экран. В таких случаях вы можете задаться вопросом, выполняется ли метод initStateснова или нет. В этой статье блога мы рассмотрим этот вопрос и приведем примеры кода для различных сценариев.
- Переход на другой экран и возврат
Давайте начнем с простого примера: вы переходите на другой экран с помощью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
- Переход на другой экран и возврат с заменой
В некоторых случаях вы можете использовать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
- Переход на другой экран и всплывающие окна до тех пор, пока
Если вы перейдете на другой экран, используя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будет выполнен снова, когда вы вернетесь.