search: add timer to search only after 0.5s inactivity

This commit is contained in:
2025-04-30 13:05:15 +02:00
parent e8541b529f
commit 2554547215

View File

@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
class Sheet {
@@ -37,32 +39,45 @@ class SheetsWidget extends StatefulWidget {
class _SheetsWidgetState extends State<SheetsWidget> {
late List<Sheet> filteredSheets;
final TextEditingController _searchController = TextEditingController();
Timer? _debounce;
@override
void initState() {
super.initState();
filteredSheets = widget.sheets;
_searchController.addListener(_filterSheets);
_searchController.addListener(_onSearchChanged);
}
@override
void dispose() {
_searchController.removeListener(_onSearchChanged);
_searchController.dispose();
_debounce?.cancel();
super.dispose();
}
void _onSearchChanged() {
if (_debounce?.isActive ?? false) _debounce!.cancel();
_debounce = Timer(const Duration(milliseconds: 500), () {
_filterSheets();
});
}
void _filterSheets() {
setState(() {
String query = _searchController.text.toLowerCase().trim();
List<String> terms = query.split(RegExp(r'\s+')); // Split by whitespace
filteredSheets = widget.sheets.where((sheet) {
filteredSheets =
widget.sheets.where((sheet) {
String name = sheet.name.toLowerCase();
String composer = sheet.composerName.toLowerCase();
// Each term must be found in either the name or composer
return terms
.every((term) => name.contains(term) || composer.contains(term));
return terms.every(
(term) => name.contains(term) || composer.contains(term),
);
}).toList();
});
}
@@ -82,7 +97,8 @@ class _SheetsWidgetState extends State<SheetsWidget> {
decoration: InputDecoration(
hintText: 'Search...',
prefixIcon: const Icon(Icons.search),
suffixIcon: _searchController.text.isNotEmpty
suffixIcon:
_searchController.text.isNotEmpty
? IconButton(
icon: const Icon(Icons.clear),
onPressed: _clearSearch,