flutterdart

Autoclose dialog in Flutter


I want to autoclose dialog a few seconds after opening. The solution that I found is to call Navigator.of(context).pop(); delayed and it works. But the problem occurs if I closed it manually (by clicking outside) before the execution of the Navigator.pop command. Then Navigator.pop just closes the app and I see just a black screen. I need a way to destroy this delay on closing the dialog or to find another workaround.

showDialog(
  context: context,
  builder: (BuildContext builderContext) {
    Future.delayed(Duration(seconds: 5), () {
      Navigator.of(context).pop();
    });

    return AlertDialog(
      backgroundColor: Colors.red,
      title: Text('Title'),
      content: SingleChildScrollView(
        child: Text('Content'),
      ),
    );
  }
);

Solution

  • You can use a Timer to achieve this. You can cancel the timer whenever you want.

    Declare a timer property in your class:

    Timer _timer;
    

    And change your showDialog code like:

    showDialog(
      context: context,
      builder: (BuildContext builderContext) {
        _timer = Timer(Duration(seconds: 5), () {
          Navigator.of(context).pop();
        });
    
        return AlertDialog(
          backgroundColor: Colors.red,
          title: Text('Title'),
          content: SingleChildScrollView(
            child: Text('Content'),
          ),
       );
      }
    ).then((val){
      if (_timer.isActive) {
        _timer.cancel();
      }
    });