Недавно я столкнулась с проблемой: во время поиска в моем приложении происходило что-то странное — оно начинало тормозить, и это раздражало. Каждое нажатие или ввод символа моментально триггерили действие, создавая нагрузку и снижая производительность.
И я нашла решение!
Дело в том, что во время поиска каждое мое нажатие инициировало отправку события на бэкенд и изменение состояния виджетов, тем самым перегружая UI. Чтобы этого избежать, я использовала Debounce.
Что такое Debounce?
Представьте, что вы разговариваете с человеком, а он перебивает после каждого слова. Debounce, в отличие от этого человека, отличный собеседник — он ждет, пока ты закончишь, и только потом реагирует.
В коде это означает, что частые вызовы функции игнорируются, пока не пройдет заданное время без нового события.
Как это работает?
✅Debounce ставит таймер при каждом вызове функции
✅Если в течение этого времени приходит новое событие, таймер сбрасывается
✅Действие выполняется только тогда, когда пауза между событиями превышает заданное время
Как использовать Debounce в коде?
Достаточно создать объект Debouncer и указать время задержки:
final _debouncer = Debouncer(milliseconds: 500);
А еще лучше — создать отдельный класс для управления Debounce:
import 'dart:async';
class Debouncer {
final int milliseconds;
Timer? _timer;
Debouncer({required this.milliseconds});
void run(VoidCallback action) {
_timer?.cancel(); // Отменяем предыдущий таймер
_timer = Timer(Duration(milliseconds: milliseconds), action); // Запускаем новый
}
void dispose() {
_timer?.cancel(); // Очищаем ресурсы
}
}
Каждый раз при вызове
run() действие выполняется не сразу, а только спустя указанное время.Где использовать Debounce?
▶️ В поиске, чтобы не отправлять запрос на сервер при каждом символе
▶️ В кнопках, чтобы избежать дублирующих API-запросов
▶️ В валидации форм, чтобы не проверять ввод на каждом символе
▶️ В анимации и UI, чтобы сглаживать обновления интерфейса
Почему это важно?
🔴Меньше запросов — API загружается только тогда, когда это действительно нужно
🔴Более плавный UI — интерфейс не дергается при быстром вводе
🔴Оптимизированная работа приложения — снижается нагрузка на процессор
🔴Экономия трафика — меньше ненужных запросов к серверу
📌Важно: не забывай освобождать ресурсы и вызывать
dispose() при уничтожении Debounce.Согласитесь, иногда Debounce не хватает и в жизни💜