fix: Added debounce logic

This commit is contained in:
Deven Joshi
2020-12-02 17:13:48 +05:30
parent 37ad5d72be
commit 9cb2ad884f
+37 -5
View File
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'dart:typed_data'; import 'dart:typed_data';
@@ -59,12 +60,45 @@ class ImageFooter extends StatefulWidget {
class _ImageFooterState extends State<ImageFooter> { class _ImageFooterState extends State<ImageFooter> {
bool _userSearchMode = false; bool _userSearchMode = false;
TextEditingController _searchController = TextEditingController(); TextEditingController _searchController;
TextEditingController _messageController = TextEditingController(); TextEditingController _messageController = TextEditingController();
String _userNameQuery;
bool _isSearchActive = false;
Set<User> _selectedUsers = {}; Set<User> _selectedUsers = {};
bool _loading = false; bool _loading = false;
Timer _debounce;
Function modalSetStateCallback;
void _userNameListener() {
if (_debounce?.isActive ?? false) _debounce.cancel();
_debounce = Timer(const Duration(milliseconds: 350), () {
if (mounted && modalSetStateCallback != null) {
modalSetStateCallback(() {
_userNameQuery = _searchController.text;
_isSearchActive = _userNameQuery.isNotEmpty;
});
}
});
}
@override
void initState() {
super.initState();
_searchController = TextEditingController()..addListener(_userNameListener);
}
@override
void dispose() {
_searchController?.clear();
_searchController?.removeListener(_userNameListener);
_searchController?.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SafeArea( return SafeArea(
@@ -218,6 +252,7 @@ class _ImageFooterState extends State<ImageFooter> {
context: context, context: context,
builder: (context) { builder: (context) {
return StatefulBuilder(builder: (context, modalSetState) { return StatefulBuilder(builder: (context, modalSetState) {
modalSetStateCallback = modalSetState;
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: _userSearchMode top: _userSearchMode
@@ -258,7 +293,7 @@ class _ImageFooterState extends State<ImageFooter> {
filter: { filter: {
if (_searchController.text.isNotEmpty) if (_searchController.text.isNotEmpty)
'name': { 'name': {
r'$autocomplete': _searchController.text, r'$autocomplete': _userNameQuery,
}, },
'id': { 'id': {
r'$ne': StreamChat.of(context).user.id, r'$ne': StreamChat.of(context).user.id,
@@ -376,9 +411,6 @@ class _ImageFooterState extends State<ImageFooter> {
Expanded( Expanded(
child: TextField( child: TextField(
controller: _searchController, controller: _searchController,
onChanged: (val) {
modalSetState(() {});
},
cursorColor: Colors.black, cursorColor: Colors.black,
autofocus: true, autofocus: true,
decoration: InputDecoration( decoration: InputDecoration(