Рецепты
Оставить только последний поиск
Объедините Debounce быстрого ввода и перезапуск устаревшей обработки в одной явной группе.
Оставить только последний поиск
Поле поиска создаёт два вида устаревшей работы. Команды могут ещё ждать паузы во вводе, а предыдущий запрос — уже выполняться. Debounce управляет первым случаем, политика restart — вторым.
Задайте ключ связанных поисков
final class SearchCatalog extends UseCaseCommand {
const SearchCatalog({required this.catalog, required this.query});
final String catalog;
final String query;
@override
Object get executionKey => catalog;
}
Ключ связывает поиски в одном каталоге. Поиск в другом каталоге остаётся независимым. Точный тип команды также входит в идентичность группы.
Объедините политики допуска и выполнения
registerCommand<SearchCatalog>(
_search,
instructions: UseCaseInstructionOverrides(
input: UseCaseInputInstructionOverrides(
debounce: UseCaseDebounceInstructions(
duration: const Duration(milliseconds: 300),
),
),
processing: const UseCaseProcessingInstructionOverrides(
existingExecutionPolicy: UseCaseExistingExecutionPolicy.restart,
),
),
);
В режиме trailing Debounce сохраняет последнюю команду во время быстрого ввода. Когда она доходит до обработки, restart запрашивает отмену связанного активного Execution, а после его завершения запускает новый.
Что наблюдать
- вытесненные команды, ожидавшие Debounce, приходят в
onCommandRejectedс типизированной причиной; - перезапущенное активное выполнение завершается с результатом
cancelledи попадает в историю; - последнее выполнение публикует видимый результат;
- несвязанные ключи продолжают работу независимо.
Не добавляйте второй UI-таймер вокруг этой политики. Окном допуска владеют часы UseCase, поэтому тест может продвигать его детерминированно.