Рецепты

Оставить только последний поиск

Объедините Debounce быстрого ввода и перезапуск устаревшей обработки в одной явной группе.

v0.1.0-dev.2Средний уровеньusecase_forge

Оставить только последний поиск

Поле поиска создаёт два вида устаревшей работы. Команды могут ещё ждать паузы во вводе, а предыдущий запрос — уже выполняться. Debounce управляет первым случаем, политика restart — вторым.

Задайте ключ связанных поисков

lib/catalog_search.dart
final class SearchCatalog extends UseCaseCommand {
  const SearchCatalog({required this.catalog, required this.query});

  final String catalog;
  final String query;

  @override
  Object get executionKey => catalog;
}

Ключ связывает поиски в одном каталоге. Поиск в другом каталоге остаётся независимым. Точный тип команды также входит в идентичность группы.

Объедините политики допуска и выполнения

lib/catalog_search.dart
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, поэтому тест может продвигать его детерминированно.

ARKTELOS

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