Флаттер при событии фокуса страницы? - PullRequest
0 голосов
/ 27 мая 2020

initState () всегда будет вызывать инициализацию страницы, и это прекрасно.

Но что, если у меня есть 2 экрана

Экран 1 переходит на экран 2. Теперь, когда вы нажимаете назад на странице 2 (pop), есть ли событие на странице 1, которое знает, что мы снова вернулись?

Другими словами, может ли Экран 1 инициировать событие при обратном нажатии страницы 2?

Это полезно для установки состояния, скажем, глобальной переменной, которая изменилась на экране 2, чтобы экран 1 мог обновляться соответствующим образом

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы можете сделать 3 разными способами в зависимости от того, что именно вы хотите.

1.popEvents (Мой любимый): вы можете использовать виджет WillPopScope на странице 2, чтобы предотвратить выход со страницы кнопками возврата.

@override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: (){
        return Future.value(a==b); //Replace by your conditionnals here. false means you're block back action for this page
      },
      child: Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(

      ),)
    );
  }

1. прослушивать только страницу 2 (только если вы хотите проверить выполнение кода на странице 1)

-page2: это необходимо, только если вы хотите выполнить свой код на странице 1 в зависимости от результата страницы 2.

Navigator.pop(data);//this is the data you want to send back to Page1
//if user presses back button, it's same like Navigator.pop(null)

-Page1: используйте отправленный Page2

final result = await Navivigator.push(MaterialPageRoute(builder: (ctx)=>Page2()));
if(result!=null){
//do somthing
}

3. Вы хотите отслеживать все события жизненного цикла приложения. Таким образом, вы можете в любое время проверить, когда пользователь вернется на страницу 1, правильно ли были выполнены задачи. или нет

-Init binding

WidgetsFlutterBinding.ensureInitialized();

-In page One добавьте WidgetsBindingObserver mixin на вашу страницу

class Page1State extends State<Page1> with WidgetsBindingObserver

-Override didChangeAppLicycleState method: это будет передать текущее состояние вашей страницы или все событие состояния приложения, например, переход в фоновый режим ...

@override 
void didChangeAppLicycleState(AppLifecycleState state){
if(state = AppLifecycleState.paused){
//do whatever you want here
   }
} 
1 голос
/ 27 мая 2020

Вы можете await Navigator.push(), который разрешится при открытии маршрута.

На Экране 1:

await Navigator.push(context, Screen2);
// Do something when Screen2 is popped

Вы также можете передавать данные из Screen2 в Screen1 с pop():

На Экране 2:

Navigator.pop(context, data);

На Экране 1:

final dataFromScreen2 = await Navigator.push(context, Screen2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...