From c5c97d712be2af656396cb60fcf720d1465be1f5 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 12 Apr 2026 16:42:02 +0200 Subject: [PATCH] debounce the search query --- lib/modules/library/library_screen.dart | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index 09689416..5a9ca8a4 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -1,5 +1,6 @@ // ignore_for_file: use_build_context_synchronously +import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/main.dart'; @@ -54,6 +55,7 @@ class _LibraryScreenState extends ConsumerState final _textEditingController = TextEditingController(); TabController? tabBarController; int _tabIndex = 0; + Timer? _searchDebounce; @override void initState() { @@ -68,6 +70,7 @@ class _LibraryScreenState extends ConsumerState void dispose() { _textEditingController.dispose(); tabBarController?.dispose(); + _searchDebounce?.cancel; super.dispose(); } @@ -266,7 +269,15 @@ class _LibraryScreenState extends ConsumerState textEditingController: _textEditingController, onSearchToggle: () => setState(() => _isSearch = !_isSearch), - onSearchClear: () => setState(() {}), + onSearchClear: () { + _searchDebounce?.cancel(); + _searchDebounce = Timer( + const Duration(milliseconds: 300), + () { + if (mounted) setState(() {}); + }, + ); + }, onIgnoreFiltersChanged: (val) => setState(() => _ignoreFiltersOnSearch = val), vsync: this, @@ -346,7 +357,12 @@ class _LibraryScreenState extends ConsumerState ignoreFiltersOnSearch: _ignoreFiltersOnSearch, textEditingController: _textEditingController, onSearchToggle: () => setState(() => _isSearch = !_isSearch), - onSearchClear: () => setState(() {}), + onSearchClear: () { + _searchDebounce?.cancel(); + _searchDebounce = Timer(const Duration(milliseconds: 300), () { + if (mounted) setState(() {}); + }); + }, onIgnoreFiltersChanged: (val) => setState(() => _ignoreFiltersOnSearch = val), vsync: this,