Showing
2 changed files
with
59 additions
and
4 deletions
1 | +import 'dart:async'; | ||
1 | import 'dart:collection'; | 2 | import 'dart:collection'; |
2 | import 'package:flutter/foundation.dart'; | 3 | import 'package:flutter/foundation.dart'; |
3 | import 'package:flutter/widgets.dart'; | 4 | import 'package:flutter/widgets.dart'; |
@@ -10,6 +11,12 @@ typedef Disposer = void Function(); | @@ -10,6 +11,12 @@ typedef Disposer = void Function(); | ||
10 | typedef GetStateUpdate = void Function(); | 11 | typedef GetStateUpdate = void Function(); |
11 | 12 | ||
12 | class ListNotifier implements Listenable { | 13 | class ListNotifier implements Listenable { |
14 | + int _version = 0; | ||
15 | + int _microtask = 0; | ||
16 | + | ||
17 | + int get notifierVersion => _version; | ||
18 | + int get notifierMicrotask => _microtask; | ||
19 | + | ||
13 | List<GetStateUpdate> _updaters = <GetStateUpdate>[]; | 20 | List<GetStateUpdate> _updaters = <GetStateUpdate>[]; |
14 | 21 | ||
15 | HashMap<String, List<GetStateUpdate>> _updatersGroupIds = | 22 | HashMap<String, List<GetStateUpdate>> _updatersGroupIds = |
@@ -18,21 +25,50 @@ class ListNotifier implements Listenable { | @@ -18,21 +25,50 @@ class ListNotifier implements Listenable { | ||
18 | @protected | 25 | @protected |
19 | void refresh() { | 26 | void refresh() { |
20 | assert(_debugAssertNotDisposed()); | 27 | assert(_debugAssertNotDisposed()); |
28 | + | ||
29 | + /// This debounce the call to update. | ||
30 | + /// It prevent errors and duplicates builds | ||
31 | + if (_microtask == _version) { | ||
32 | + _microtask++; | ||
33 | + scheduleMicrotask(() { | ||
34 | + _version++; | ||
35 | + _microtask = _version; | ||
36 | + _notifyUpdate(); | ||
37 | + }); | ||
38 | + } | ||
39 | + } | ||
40 | + | ||
41 | + void _notifyUpdate() { | ||
21 | for (var element in _updaters) { | 42 | for (var element in _updaters) { |
22 | element(); | 43 | element(); |
23 | } | 44 | } |
24 | } | 45 | } |
25 | 46 | ||
26 | - @protected | ||
27 | - void refreshGroup(String id) { | ||
28 | - assert(_debugAssertNotDisposed()); | 47 | + void _notifyIdUpdate(String id) { |
29 | if (_updatersGroupIds.containsKey(id)) { | 48 | if (_updatersGroupIds.containsKey(id)) { |
30 | - for (var item in _updatersGroupIds[id]) { | 49 | + final listGroup = _updatersGroupIds[id]; |
50 | + for (var item in listGroup) { | ||
31 | item(); | 51 | item(); |
32 | } | 52 | } |
33 | } | 53 | } |
34 | } | 54 | } |
35 | 55 | ||
56 | + @protected | ||
57 | + void refreshGroup(String id) { | ||
58 | + assert(_debugAssertNotDisposed()); | ||
59 | + | ||
60 | + /// This debounce the call to update. | ||
61 | + /// It prevent errors and duplicates builds | ||
62 | + if (_microtask == _version) { | ||
63 | + _microtask++; | ||
64 | + scheduleMicrotask(() { | ||
65 | + _version++; | ||
66 | + _microtask = _version; | ||
67 | + _notifyIdUpdate(id); | ||
68 | + }); | ||
69 | + } | ||
70 | + } | ||
71 | + | ||
36 | bool _debugAssertNotDisposed() { | 72 | bool _debugAssertNotDisposed() { |
37 | assert(() { | 73 | assert(() { |
38 | if (_updaters == null) { | 74 | if (_updaters == null) { |
1 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | 2 | ||
3 | +class GetMicrotask { | ||
4 | + int _version = 0; | ||
5 | + int _microtask = 0; | ||
6 | + | ||
7 | + int get version => _version; | ||
8 | + int get microtask => _microtask; | ||
9 | + | ||
10 | + void exec(Function callback) { | ||
11 | + if (_microtask == _version) { | ||
12 | + _microtask++; | ||
13 | + scheduleMicrotask(() { | ||
14 | + _version++; | ||
15 | + _microtask = _version; | ||
16 | + callback(); | ||
17 | + }); | ||
18 | + } | ||
19 | + } | ||
20 | +} | ||
21 | + | ||
3 | class GetQueue { | 22 | class GetQueue { |
4 | final List<_Item> _queue = []; | 23 | final List<_Item> _queue = []; |
5 | bool _active = false; | 24 | bool _active = false; |
-
Please register or login to post a comment