При вызове Navigator.pop() результат может быть передан на предыдущий экран. Есть ли способ установить результат так, чтобы, если пользователь переместился обратно самостоятельно, результат все еще возвращался на предыдущую страницу?

Я мог бы передать объект на вторую страницу, а затем изменить его, чтобы первая страница могла проверить его при возврате второй страницы, но я бы лучше использовал результат, возвращенный из навигатора, так как он более читабелен.

Переопределение детектора касания кнопки «назад», как я видел в другом месте, не является приемлемым решением, поскольку пользователь может перемещаться назад каким-либо другим способом, например, пролистывая или нажимая кнопку «назад» на Android.

0
Chris Wickens 4 Май 2020 в 17:52

2 ответа

Да, это возможно при переходе к Screen B из Screen A, сделайте onTap() функцию asynchronous и дождитесь результата от Screen B.

Проверьте код ниже: он отлично работает:

На Screen A поместите этот код:

 onTap: () async {
        // receive the data you are sending from screen B here
        final result = await Navigator.push( context);
       },

На Screen B поместите этот код:

onTap: (){
    // pass the data you want to use in screen A as the second paramter
     Navigator.pop(context,number);
      },

Надеюсь, это поможет

0
Random Guru 4 Май 2020 в 15:39

Да, вы можете передавать данные между экранами в обоих направлениях. Во время возврата отправьте data, который вы хотите отправить, так со второго экрана.

RaisedButton(
  onPressed: () {
    // The Nope button returns "data" as the result.
    Navigator.pop(context, 'data');
  },
  child: Text('Nope!'),
);

И поймать результат на вашем первом экране, как это

final result = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondScreen()),
  );

источник

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

@override
  Widget build(BuildContext context) {
    return WillPopScope(
      child: Scaffold(), // or your widget
      onWillPop: () {
        return Future.delayed(Duration(microseconds: 0), () {
          return Navigator.pop(context, "return-data");
        });
      },
    );
  }
0
Ashutosh Singh 4 Май 2020 в 16:27