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 1: Aleksandar

You can use different way of executing pop() request using Timer

_timer = Timer(Duration(seconds: _timerTimeoutInterval), () {
    Navigator.of(context).pop();
});

And in case you want to cancel the timer you can call this:

if (_timer != null && _timer.isActive) {
  _timer.cancel();
}


Solution 2: Midhun MP

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();
  }
});


Solution 3: encubos

In this case, you are using the wrong context.

Try to change the context you are using in the "pop"

You have this BuildContext builderContext, use that builderContext like:

Navigator.of(builderContext).pop();