Каков наилучший способ вызвать функцию, если нет ответа от ShowDialog через x секунд в Futter

#flutter #showdialog

#flutter #showdialog

Вопрос:

Я вроде как новичок в flutter. Я искал, но не смог найти подходящего ответа на этот вопрос… Каков наилучший способ вызвать функцию, если пользователь не отвечает на предупреждение ShowDialog через x секунд? Если пользователь нажимает кнопку, я не хочу, чтобы функция выполнялась.

Комментарии:

1. Вы можете использовать таймер

Ответ №1:

Вы можете запустить a Timer в течение x секунд, как только отобразите свой диалог, а затем выполните свою функцию. Если пользователь нажимает вашу кнопку, вы можете остановить свой таймер.

 Timer _timer;
bool userResponded = false;
 

Вам понадобится StatefulWidget amp; везде, где вы показываете свой диалог, вам нужно запустить таймер.

 showDialog(...); // Your showDialog method
// You have to update userResponded to true if user clicks on your dialog or whatever
// It should look something like this: setState(() => userResponded = true);

_timer = Timer(const Duration(seconds: 10), () { // Start your timer for x seconds
  if (!userResponded) { // If user didn't respond
    // execute your function
  }
});
 

Кроме того, вам необходимо переопределить onDispose метод и остановить таймер:

 @override
void onDispose() {
  _timer?.cancel();
  super.onDispose();
}
 

Комментарии:

1. Спасибо за ответ, но возможно ли также работать в классе без состояния?

2. Я бы не рекомендовал запускать a Timer в a StatelessWidget (класс без состояния). Причина, по которой я рекомендую a StatefulWidget , заключается в том, что вы получаете dispose метод предотвращения утечек памяти.

3. Хммм… однако это вызывает у меня проблему с дизайном. Что, если я вызову `_timer?.cancel` сразу после завершения таймера или если пользователь нажмет ok? Это все еще небезопасно?

4. Нет, это будет работать отлично. Вы можете это сделать. Но тогда вам нужно начать Timer , прежде чем показывать свой диалог.

5. понял. Спасибо. Помечено как правильный ответ.

Ответ №2:

Для этого вы должны использовать виджет таймера.

Пример таймера:

 Timer _timer = Timer(
  const Duration(milliseconds: 500),
  () {
    // Call some function after delay of 500ms
  },
);
 

Чтобы отменить таймер, используйте _timer.cancel();

Итак, скорее всего, в методе initState вы захотите установить объект timer, затем, когда пользователь нажимает кнопку, вы можете отменить этот таймер, что означает, что обратный вызов в нем не будет выполняться после указанной вами задержки.