5

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'),
      ),
    );
  }
);
micobg
  • 1,272
  • 6
  • 21
  • 35

3 Answers3

16

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();
  }
});
Midhun MP
  • 103,496
  • 31
  • 153
  • 200
3

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();
encubos
  • 2,915
  • 10
  • 19
1

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();
}
Aleksandar
  • 1,457
  • 13
  • 30
  • You can close it manually by creating button and executing Navigator pop method in that button's onPress callback. – Aleksandar Apr 20 '20 at 10:37
  • Yes, but I want to close it by clicking outside. – micobg Apr 20 '20 at 19:13
  • Ahhhh sorry, I read the question wrong. In order to close the dialog and cancel that execution of a pop, you need to use timer, that can be cancelled on demand. I will edit my initial answer. – Aleksandar Apr 21 '20 at 20:34