Как автоматически отключить виджет оповещений Dialog в Flutter? - PullRequest
1 голос
/ 19 марта 2020

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

Как только запускается будущая функция, я хочу показать предупреждение о загрузке. Когда запрос / ответ API обрабатывается, если произошла ошибка, она должна быть показана в showErrorDialog, а загрузкаDialog должна быть автоматически отклонена.

Прямо сейчас, ErrorDialog показывает и может быть отклонен его кнопкой, но тогда LoadingDialog не будет отклонен.

Я могу сделать это с Future.delayed, но это просто обходной путь, имеющий слишком много переменных результатов. Вот фиктивный код:

import 'package:flutter/material.dart';

class RandomScreen extends StatefulWidget {
  @override
  _RandomScreenState createState() => _RandomScreenState();
}

class _RandomScreenState extends State<RandomScreen> {

  Future<void> _submitApiRequest() async {
    try {
      _showLoadingAlert();

      //processing the API request/response here.

    } catch (error) {
      _showErrorDialogue(error.toString());
    }
  }

  void _showErrorDialogue(String errorMessage) {
    showDialog(
      context: context,
      builder: (ctx) => Dialog(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(20.0),
        ),
        child: Column(
          children: <Widget>[
            Text(errorMessage),
            FlatButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text(
                'Dismiss',
              ),
            ),
          ],
        ),
      ),
    );
  }

  void _showLoadingAlert() {
    showDialog(
      context: context,
      builder: (ctx) => CircularProgressIndicator(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Random Screen'),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: _submitApiRequest,
          child: Text('Submit'),
        ),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 19 марта 2020

Путь, который вы пытаетесь сделать, может быть не самым лучшим, если вы пытаетесь вызвать API и показать экран загрузки. Я бы порекомендовал вам использовать ModalProgressHud

. Это покажет загрузчик, когда вы пытаетесь выполнить вызов API, и после получения ответа API вы можете скрыть загрузчик, используя переменную состояния.

Если вы все еще хотите использовать окно оповещения, вам нужно вызвать Navigator.pop, как указано в документации .

Если в приложении имеется несколько объектов Navigator, может потребоваться вызвать Navigator.of(context, rootNavigator: true).pop(result), чтобы закрыть диалог, а не просто Navigator.pop(context, result).

...