#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
в aStatelessWidget
(класс без состояния). Причина, по которой я рекомендую aStatefulWidget
, заключается в том, что вы получаете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, затем, когда пользователь нажимает кнопку, вы можете отменить этот таймер, что означает, что обратный вызов в нем не будет выполняться после указанной вами задержки.