Untitled
unknown
plain_text
a year ago
2.2 kB
10
Indexable
import 'package:chat360_base/debouncer/debouncer.dart';
import 'package:flutter/material.dart';
abstract class SearchListingProvider<V> extends ChangeNotifier {
SearchListingProvider() {
_loadData();
}
bool hasError = false;
Future<List<V>?> fetchPage();
bool searchComparer(String? text, V data);
bool isRefreshing = false;
List<V> get items => shouldSearching ? _searchItems : _pageItems;
bool get loading => shouldSearching ? _isSearching : _isLoading;
bool shouldSearching = false;
bool _isSearching = false;
bool _isLoading = true;
List<V> _pageItems = [];
List<V> _searchItems = [];
TextEditingController searchTextController = TextEditingController();
final Map<String, List<V>> _indexedSearch = {};
final _debouncer = CustomDebouncer(milliseconds: 500);
void refreshData() async {
hasError = false;
isRefreshing = true;
notifyListeners();
List<V>? model = await fetchPage();
_pageItems = (model ?? []).cast();
isRefreshing = false;
notifyListeners();
}
void _loadData() async {
_isLoading = true;
notifyListeners();
List<V>? model = await fetchPage();
_pageItems.addAll((model ?? []).cast());
_isLoading = false;
notifyListeners();
}
searchCallback(String text) {
if (text.isEmpty) {
_resetSearching();
return;
}
shouldSearching = true;
notifyListeners();
_debouncer.run(() async {
_isSearching = true;
notifyListeners();
if (_indexedSearch[text] != null && _indexedSearch[text]!.isNotEmpty) {
_searchItems = _indexedSearch[text] ?? [];
_isSearching = false;
notifyListeners();
} else {
_fetchSearchPage(text).then((items) {
_indexedSearch[text] = items;
_searchItems = items;
_isSearching = false;
notifyListeners();
});
}
});
}
void _resetSearching() {
_isSearching = false;
shouldSearching = false;
_searchItems.clear();
notifyListeners();
return;
}
Future<List<V>> _fetchSearchPage(String? text) async {
List<V>? model = items.where((v) => searchComparer(text, v)).toList();
return (model).cast();
}
}
Editor is loading...
Leave a Comment