Как показать диалог в FutureBuilder - PullRequest
0 голосов
/ 30 апреля 2020

В Flutter я использовал FutureBuilder для отображения данных из API. Я хотел бы открыть диалоговое окно с сообщением об ошибке при возникновении ошибки.

Однако оно выдает ошибку при вызове showDialog ()

setState() or markNeedsBuild() called during build.

Вот мой код

    return FutureBuilder(
      future: xxx,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          //DO SOMETHING

        } else if (snapshot.hasError) {
          //TODO: Show Error

          showDialog(
              context: context,
              builder: (BuildContext context) {
                return AlertDialog(
                  title: Text("Error"),
                  content: Text("HAHAHA"),
                  actions: <Widget>[
                    FlatButton(
                      child: Text("No"),
                    ),
                    FlatButton(
                        child: Text("Yes")
                    ),
                  ],
                );
              }
          );

          return Container();

        } else {
          //DO SOMETHING
        }
      },

Помогите, пожалуйста, посоветовать, как я могу показать диалог в FutureBuilder.

1 Ответ

1 голос
/ 30 апреля 2020

Мы не можем вызывать setState, navigate или showDialog, пока метод сборки создает виджет. Итак, мы можем подождать, пока микросекунда и тем временем метод сборки завершит создание виджета, поэтому мы можем отобразить диалоговое окно.

Создайте метод, как показано ниже.

showError() async {
    await Future.delayed(Duration(microseconds: 1));
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Error"),
            content: Text("HAHAHA"),
            actions: <Widget>[
              FlatButton(
                child: Text("No"),
              ),
              FlatButton(child: Text("Yes")),
            ],
          );
        });
  }

И вызовите этот метод там, где вы хотите показать диалог.

...