Parcourir la source

Refactor Debouncer

vishnukvmd il y a 2 ans
Parent
commit
0db99f915a
2 fichiers modifiés avec 18 ajouts et 22 suppressions
  1. 6 10
      lib/ui/viewer/search/search_widget.dart
  2. 12 12
      lib/utils/search_debouncer.dart

+ 6 - 10
lib/ui/viewer/search/search_widget.dart

@@ -104,13 +104,13 @@ class _SearchWidgetState extends State<SearchWidget> {
                           ),
                         ),
                         suffixIcon: ValueListenableBuilder(
-                          valueListenable: _debouncer.timerIsActive,
+                          valueListenable: _debouncer.debounceActiveNotifier,
                           builder: (
                             BuildContext context,
-                            bool timerIsActive,
+                            bool isDebouncing,
                             Widget child,
                           ) {
-                            return SearchSuffixIcon(timerIsActive);
+                            return SearchSuffixIcon(isDebouncing);
                           },
                         ),
                       ),
@@ -151,23 +151,20 @@ class _SearchWidgetState extends State<SearchWidget> {
   Future<List<SearchResult>> getSearchResultsForQuery(String query) async {
     final List<SearchResult> allResults = [];
     if (query.isEmpty) {
-      if (_debouncer.isActive()) {
-        _debouncer.cancel();
-        _debouncer.timerCompleted();
-      }
+      _debouncer.cancel();
       return (allResults);
     }
 
     final Completer<List<SearchResult>> completer = Completer();
 
     _debouncer.run(() {
-      _getSearchResultsFromService(query, completer, allResults);
+      return _getSearchResultsFromService(query, completer, allResults);
     });
 
     return completer.future;
   }
 
-  void _getSearchResultsFromService(
+  Future<void> _getSearchResultsFromService(
     String query,
     Completer completer,
     List<SearchResult> allResults,
@@ -192,7 +189,6 @@ class _SearchWidgetState extends State<SearchWidget> {
     allResults.addAll(monthResults);
 
     completer.complete(allResults);
-    _debouncer.timerCompleted();
   }
 
   bool _isYearValid(String year) {

+ 12 - 12
lib/utils/search_debouncer.dart

@@ -4,16 +4,20 @@ import 'package:flutter/material.dart';
 
 class Debouncer {
   final Duration _duration;
+  final ValueNotifier<bool> _debounceActiveNotifier = ValueNotifier(false);
   Timer _debounceTimer;
-  final ValueNotifier<bool> _timerIsActive = ValueNotifier(false);
+  
   Debouncer(this._duration);
 
-  void run(Function fn) {
-    if (_debounceTimer != null && _debounceTimer.isActive) {
+  void run(Future<void> Function() fn) {
+    if (isActive()) {
       _debounceTimer.cancel();
     }
-    _debounceTimer = Timer(_duration, fn);
-    _timerIsActive.value = isActive();
+    _debounceTimer = Timer(_duration, () async {
+      await fn();
+      _debounceActiveNotifier.value = false;
+    });
+    _debounceActiveNotifier.value = true;
   }
 
   void cancel() {
@@ -23,14 +27,10 @@ class Debouncer {
   }
 
   bool isActive() {
-    return (_debounceTimer != null) && _debounceTimer.isActive;
+    return _debounceTimer != null && _debounceTimer.isActive;
   }
 
-  ValueNotifier<bool> get timerIsActive {
-    return _timerIsActive;
-  }
-
-  void timerCompleted() {
-    _timerIsActive.value = false;
+  ValueNotifier<bool> get debounceActiveNotifier {
+    return _debounceActiveNotifier;
   }
 }