Лучшая практика Flutter pop

#flutter #dart #navigator

#трепетание #дротик #навигатор

Вопрос:

У меня есть следующий экран потока 1 -> Экран 2 -> Диалоговое окно (в отдельном виджете).

На экране 2 отображается диалоговое окно (закрыть? Да или нет). Если кто-то нажимает «Да», я хотел бы вернуться к экрану 1, если они нажимают «Нет», просто закройте диалоговое окно и вернитесь к экрану 2. В настоящее время я делаю, когда нажимается «Да», я дважды выполняю Navigator.pop (контекст). Это хорошая практика? Есть ли способ передать контекст экрана 2 в мой виджет диалогового окна, чтобы я мог открыть его напрямую?

Ответ №1:

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

Вы можете сделать это:

 //I'm using a raised button just to call the alert as an example... 
RaisedButton(
    child: Text('Press me'),
    //This part here is the important part
    onPressed: () async {

      //You can return anything when you use Navigator.pop
      //In this case I'm returning a bool indicating if the page should close or not.
      //You have to await this because it depends on user input.
      bool shouldPopResult = await showDialog<bool>(
        context: context,
        builder: (context) => AlertDialog(
          //The content of your dialog

          actions: <Widget>[
            // The value you pass here in Navigator.of(context).pop
            // is the value that will be stored in shouldPopResult,
            // so if "Yes" is pressed, true will return...
            // and if "No", false is returned.
            FlatButton(
              child: Text('Yes'),
              onPressed: () => Navigator.of(context).pop(true),
            ),
            FlatButton(
              child: Text('No'),
              onPressed: () => Navigator.of(context).pop(false),
            )
          ],
        ),
      );

      // This is for if the user dismisses the dialog without pressing a button
      // In that case shouldPopResult would be null, so I'm setting it to false.
      // You can prevent the user from dismissing the dialog
      // setting barrierDismissible to false in the showDialog method.
      if (shouldPopResult == null) shouldPopResult = false;

      // And finally with the dialog already dismissed, you can decide 
      // to go back or not.
      if (shouldPopResult) Navigator.of(context).pop();
    });
  

Как обычно, вы можете извлечь диалоговое окно в виде виджета или извлечь функцию, которая полностью обрабатывает ответ диалога, или что-нибудь еще.

Вы можете увидеть пример возврата данных со страницы в документации flutter здесь .