import 'package:flutter/material.dart'; import 'dart:async'; /// Barre de recherche pour les événements class EvenementSearchBar extends StatefulWidget { final Function(String) onSearch; final String? initialValue; final String hintText; final Duration debounceTime; const EvenementSearchBar({ super.key, required this.onSearch, this.initialValue, this.hintText = 'Rechercher un événement...', this.debounceTime = const Duration(milliseconds: 500), }); @override State createState() => _EvenementSearchBarState(); } class _EvenementSearchBarState extends State { late TextEditingController _controller; Timer? _debounceTimer; @override void initState() { super.initState(); _controller = TextEditingController(text: widget.initialValue); } @override void dispose() { _controller.dispose(); _debounceTimer?.cancel(); super.dispose(); } void _onSearchChanged(String value) { _debounceTimer?.cancel(); _debounceTimer = Timer(widget.debounceTime, () { widget.onSearch(value.trim()); }); } void _clearSearch() { _controller.clear(); widget.onSearch(''); } @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( color: Colors.grey[100], borderRadius: BorderRadius.circular(12), border: Border.all(color: Colors.grey[300]!), ), child: TextField( controller: _controller, onChanged: _onSearchChanged, decoration: InputDecoration( hintText: widget.hintText, prefixIcon: const Icon(Icons.search, color: Colors.grey), suffixIcon: _controller.text.isNotEmpty ? IconButton( onPressed: _clearSearch, icon: const Icon(Icons.clear, color: Colors.grey), ) : null, border: InputBorder.none, contentPadding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), ), ), ); } }