Showing
10 changed files
with
378 additions
and
10 deletions
1 | -typedef ValueCallback<T> = Function(T v); |
1 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | - | ||
3 | import 'package:flutter/scheduler.dart'; | 2 | import 'package:flutter/scheduler.dart'; |
4 | -import 'package:get/src/state_manager/rx/rx_callbacks.dart'; | 3 | +import 'rx_typedefs.dart'; |
5 | 4 | ||
6 | /// This class is the foundation for all reactive (Rx) classes that makes Get | 5 | /// This class is the foundation for all reactive (Rx) classes that makes Get |
7 | /// so powerful. | 6 | /// so powerful. |
@@ -6,14 +6,17 @@ import 'rx_impl.dart'; | @@ -6,14 +6,17 @@ import 'rx_impl.dart'; | ||
6 | import 'rx_interface.dart'; | 6 | import 'rx_interface.dart'; |
7 | import 'rx_typedefs.dart'; | 7 | import 'rx_typedefs.dart'; |
8 | 8 | ||
9 | + | ||
9 | /// Create a list similar to `List<T>` | 10 | /// Create a list similar to `List<T>` |
10 | class RxList<E> implements List<E>, RxInterface<List<E>> { | 11 | class RxList<E> implements List<E>, RxInterface<List<E>> { |
11 | RxList([List<E> initial]) { | 12 | RxList([List<E> initial]) { |
12 | _list = initial; | 13 | _list = initial; |
13 | } | 14 | } |
14 | 15 | ||
16 | + List<E> _list = <E>[]; | ||
17 | + | ||
15 | @override | 18 | @override |
16 | - Iterator<E> get iterator => _list.iterator; | 19 | + Iterator<E> get iterator => value.iterator; |
17 | 20 | ||
18 | @override | 21 | @override |
19 | bool get isEmpty => value.isEmpty; | 22 | bool get isEmpty => value.isEmpty; |
@@ -193,8 +196,6 @@ class RxList<E> implements List<E>, RxInterface<List<E>> { | @@ -193,8 +196,6 @@ class RxList<E> implements List<E>, RxInterface<List<E>> { | ||
193 | void bindStream(Stream<Iterable<E>> stream) => | 196 | void bindStream(Stream<Iterable<E>> stream) => |
194 | stream.listen((va) => value = va); | 197 | stream.listen((va) => value = va); |
195 | 198 | ||
196 | - List<E> _list = <E>[]; | ||
197 | - | ||
198 | @override | 199 | @override |
199 | E get first => _list.first; | 200 | E get first => _list.first; |
200 | 201 |
lib/src/state_manager/rx/rx_set.dart
0 → 100644
1 | +import 'dart:async'; | ||
2 | + | ||
3 | +import 'package:flutter/foundation.dart'; | ||
4 | + | ||
5 | +import 'rx_impl.dart'; | ||
6 | +import 'rx_interface.dart'; | ||
7 | +import 'rx_typedefs.dart'; | ||
8 | + | ||
9 | +class RxSet<E> implements Set<E>, RxInterface<Set<E>> { | ||
10 | + RxSet([Set<E> initial]) { | ||
11 | + _list = initial; | ||
12 | + } | ||
13 | + | ||
14 | + RxSet<E> _list = Set<E>(); | ||
15 | + | ||
16 | + @override | ||
17 | + Iterator<E> get iterator => value.iterator; | ||
18 | + | ||
19 | + @override | ||
20 | + bool get isEmpty => value.isEmpty; | ||
21 | + | ||
22 | + bool get canUpdate { | ||
23 | + return _subscriptions.length > 0; | ||
24 | + } | ||
25 | + | ||
26 | + @override | ||
27 | + bool get isNotEmpty => value.isNotEmpty; | ||
28 | + | ||
29 | + StreamController<Set<E>> subject = StreamController<Set<E>>.broadcast(); | ||
30 | + Map<Stream<Set<E>>, StreamSubscription> _subscriptions = Map(); | ||
31 | + | ||
32 | + /// Adds [item] only if [condition] resolves to true. | ||
33 | + void addIf(condition, E item) { | ||
34 | + if (condition is Condition) condition = condition(); | ||
35 | + if (condition is bool && condition) add(item); | ||
36 | + } | ||
37 | + | ||
38 | + /// Adds all [items] only if [condition] resolves to true. | ||
39 | + void addAllIf(condition, Iterable<E> items) { | ||
40 | + if (condition is Condition) condition = condition(); | ||
41 | + if (condition is bool && condition) addAll(items); | ||
42 | + } | ||
43 | + | ||
44 | + operator []=(int index, E val) { | ||
45 | + _list[index] = val; | ||
46 | + subject.add(_list); | ||
47 | + } | ||
48 | + | ||
49 | + /// Special override to push() element(s) in a reactive way | ||
50 | + /// inside the List, | ||
51 | + RxSet<E> operator +(Iterable<E> val) { | ||
52 | + addAll(val); | ||
53 | + subject.add(_list); | ||
54 | + return this; | ||
55 | + } | ||
56 | + | ||
57 | + @override | ||
58 | + bool add(E value) { | ||
59 | + final val = _list.add(value); | ||
60 | + subject.add(_list); | ||
61 | + return val; | ||
62 | + } | ||
63 | + | ||
64 | + void addAll(Iterable<E> item) { | ||
65 | + _list.addAll(item); | ||
66 | + subject.add(_list); | ||
67 | + } | ||
68 | + | ||
69 | + /// Adds only if [item] is not null. | ||
70 | + void addNonNull(E item) { | ||
71 | + if (item != null) add(item); | ||
72 | + } | ||
73 | + | ||
74 | + /// Adds only if [item] is not null. | ||
75 | + void addAllNonNull(Iterable<E> item) { | ||
76 | + if (item != null) addAll(item); | ||
77 | + } | ||
78 | + | ||
79 | + void insert(int index, E item) { | ||
80 | + _list.insert(index, item); | ||
81 | + subject.add(_list); | ||
82 | + } | ||
83 | + | ||
84 | + void insertAll(int index, Iterable<E> iterable) { | ||
85 | + _list.insertAll(index, iterable); | ||
86 | + subject.add(_list); | ||
87 | + } | ||
88 | + | ||
89 | + int get length => value.length; | ||
90 | + | ||
91 | + /// Removes an item from the list. | ||
92 | + /// | ||
93 | + /// This is O(N) in the number of items in the list. | ||
94 | + /// | ||
95 | + /// Returns whether the item was present in the list. | ||
96 | + bool remove(Object item) { | ||
97 | + bool hasRemoved = _list.remove(item); | ||
98 | + if (hasRemoved) { | ||
99 | + subject.add(_list); | ||
100 | + } | ||
101 | + return hasRemoved; | ||
102 | + } | ||
103 | + | ||
104 | + E removeAt(int index) { | ||
105 | + E item = _list.removeAt(index); | ||
106 | + subject.add(_list); | ||
107 | + return item; | ||
108 | + } | ||
109 | + | ||
110 | + E removeLast() { | ||
111 | + E item = _list.removeLast(); | ||
112 | + subject.add(_list); | ||
113 | + return item; | ||
114 | + } | ||
115 | + | ||
116 | + void removeRange(int start, int end) { | ||
117 | + _list.removeRange(start, end); | ||
118 | + subject.add(_list); | ||
119 | + } | ||
120 | + | ||
121 | + void removeWhere(bool Function(E) test) { | ||
122 | + _list.removeWhere(test); | ||
123 | + subject.add(_list); | ||
124 | + } | ||
125 | + | ||
126 | + void clear() { | ||
127 | + _list.clear(); | ||
128 | + subject.add(_list); | ||
129 | + } | ||
130 | + | ||
131 | + void sort([int compare(E a, E b)]) { | ||
132 | + _list.sort(); | ||
133 | + subject.add(_list); | ||
134 | + } | ||
135 | + | ||
136 | + close() { | ||
137 | + _subscriptions.forEach((observable, subscription) { | ||
138 | + subscription.cancel(); | ||
139 | + }); | ||
140 | + _subscriptions.clear(); | ||
141 | + subject.close(); | ||
142 | + } | ||
143 | + | ||
144 | + /// Replaces all existing items of this list with [item] | ||
145 | + void assign(E item) { | ||
146 | + clear(); | ||
147 | + add(item); | ||
148 | + } | ||
149 | + | ||
150 | + void update(void fn(Iterable<E> value)) { | ||
151 | + fn(value); | ||
152 | + subject.add(_list); | ||
153 | + } | ||
154 | + | ||
155 | + /// Replaces all existing items of this list with [items] | ||
156 | + void assignAll(Iterable<E> items) { | ||
157 | + clear(); | ||
158 | + addAll(items); | ||
159 | + } | ||
160 | + | ||
161 | + @protected | ||
162 | + Set<E> get value { | ||
163 | + if (getObs != null) { | ||
164 | + getObs.addListener(subject.stream); | ||
165 | + } | ||
166 | + return _list; | ||
167 | + } | ||
168 | + | ||
169 | + String get string => value.toString(); | ||
170 | + | ||
171 | + addListener(Stream<Set<E>> rxGetx) { | ||
172 | + if (_subscriptions.containsKey(rxGetx)) { | ||
173 | + return; | ||
174 | + } | ||
175 | + _subscriptions[rxGetx] = rxGetx.listen((data) { | ||
176 | + subject.add(data); | ||
177 | + }); | ||
178 | + } | ||
179 | + | ||
180 | + set value(Iterable<E> val) { | ||
181 | + if (_list == val) return; | ||
182 | + _list = val; | ||
183 | + subject.add(_list); | ||
184 | + } | ||
185 | + | ||
186 | + Stream<Set<E>> get stream => subject.stream; | ||
187 | + | ||
188 | + StreamSubscription<Set<E>> listen(void Function(Set<E>) onData, | ||
189 | + {Function onError, void Function() onDone, bool cancelOnError}) => | ||
190 | + stream.listen(onData, onError: onError, onDone: onDone); | ||
191 | + | ||
192 | + void bindStream(Stream<Iterable<E>> stream) => | ||
193 | + stream.listen((va) => value = va); | ||
194 | + | ||
195 | + @override | ||
196 | + E get first => _list.first; | ||
197 | + | ||
198 | + @override | ||
199 | + E get last => _list.last; | ||
200 | + | ||
201 | + @override | ||
202 | + bool any(bool Function(E) test) { | ||
203 | + return _list.any(test); | ||
204 | + } | ||
205 | + | ||
206 | + @override | ||
207 | + Set<R> cast<R>() { | ||
208 | + return _list.cast<R>(); | ||
209 | + } | ||
210 | + | ||
211 | + @override | ||
212 | + bool contains(Object element) { | ||
213 | + return _list.contains(element); | ||
214 | + } | ||
215 | + | ||
216 | + @override | ||
217 | + E elementAt(int index) { | ||
218 | + return _list.elementAt(index); | ||
219 | + } | ||
220 | + | ||
221 | + @override | ||
222 | + bool every(bool Function(E) test) { | ||
223 | + return _list.every(test); | ||
224 | + } | ||
225 | + | ||
226 | + @override | ||
227 | + Iterable<T> expand<T>(Iterable<T> Function(E) f) { | ||
228 | + return _list.expand(f); | ||
229 | + } | ||
230 | + | ||
231 | + @override | ||
232 | + E firstWhere(bool Function(E) test, {E Function() orElse}) { | ||
233 | + return _list.firstWhere(test, orElse: orElse); | ||
234 | + } | ||
235 | + | ||
236 | + @override | ||
237 | + T fold<T>(T initialValue, T Function(T, E) combine) { | ||
238 | + return _list.fold(initialValue, combine); | ||
239 | + } | ||
240 | + | ||
241 | + @override | ||
242 | + Iterable<E> followedBy(Iterable<E> other) { | ||
243 | + return _list.followedBy(other); | ||
244 | + } | ||
245 | + | ||
246 | + @override | ||
247 | + void forEach(void Function(E) f) { | ||
248 | + _list.forEach(f); | ||
249 | + } | ||
250 | + | ||
251 | + @override | ||
252 | + String join([String separator = ""]) { | ||
253 | + return _list.join(separator); | ||
254 | + } | ||
255 | + | ||
256 | + @override | ||
257 | + E lastWhere(bool Function(E) test, {E Function() orElse}) { | ||
258 | + return _list.lastWhere(test, orElse: orElse); | ||
259 | + } | ||
260 | + | ||
261 | + @override | ||
262 | + Iterable<T> map<T>(T Function(E) f) { | ||
263 | + return _list.map(f); | ||
264 | + } | ||
265 | + | ||
266 | + @override | ||
267 | + E reduce(E Function(E, E) combine) { | ||
268 | + return _list.reduce(combine); | ||
269 | + } | ||
270 | + | ||
271 | + @override | ||
272 | + E get single => _list.single; | ||
273 | + | ||
274 | + @override | ||
275 | + E singleWhere(bool Function(E) test, {E Function() orElse}) { | ||
276 | + return _list.singleWhere(test, orElse: orElse); | ||
277 | + } | ||
278 | + | ||
279 | + @override | ||
280 | + Iterable<E> skip(int count) { | ||
281 | + return _list.skip(count); | ||
282 | + } | ||
283 | + | ||
284 | + @override | ||
285 | + Iterable<E> skipWhile(bool Function(E) test) { | ||
286 | + return _list.skipWhile(test); | ||
287 | + } | ||
288 | + | ||
289 | + @override | ||
290 | + Iterable<E> take(int count) { | ||
291 | + return _list.take(count); | ||
292 | + } | ||
293 | + | ||
294 | + @override | ||
295 | + Iterable<E> takeWhile(bool Function(E) test) { | ||
296 | + return _list.takeWhile(test); | ||
297 | + } | ||
298 | + | ||
299 | + @override | ||
300 | + List<E> toList({bool growable = true}) { | ||
301 | + return _list.toList(growable: growable); | ||
302 | + } | ||
303 | + | ||
304 | + @override | ||
305 | + Set<E> toSet() { | ||
306 | + return _list.toSet(); | ||
307 | + } | ||
308 | + | ||
309 | + @override | ||
310 | + Iterable<E> where(bool Function(E) test) { | ||
311 | + return _list.where(test); | ||
312 | + } | ||
313 | + | ||
314 | + @override | ||
315 | + Iterable<T> whereType<T>() { | ||
316 | + return _list.whereType<T>(); | ||
317 | + } | ||
318 | + | ||
319 | + @override | ||
320 | + bool containsAll(Iterable<Object> other) { | ||
321 | + return _list.containsAll(other); | ||
322 | + } | ||
323 | + | ||
324 | + @override | ||
325 | + Set<E> difference(Set<Object> other) { | ||
326 | + return _list.difference(other); | ||
327 | + } | ||
328 | + | ||
329 | + @override | ||
330 | + Set<E> intersection(Set<Object> other) { | ||
331 | + return _list.intersection(other); | ||
332 | + } | ||
333 | + | ||
334 | + @override | ||
335 | + E lookup(Object object) { | ||
336 | + return _list.lookup(object); | ||
337 | + } | ||
338 | + | ||
339 | + @override | ||
340 | + void removeAll(Iterable<Object> elements) { | ||
341 | + _list.removeAll(elements); | ||
342 | + } | ||
343 | + | ||
344 | + @override | ||
345 | + void retainAll(Iterable<Object> elements) { | ||
346 | + _list.retainAll(elements); | ||
347 | + } | ||
348 | + | ||
349 | + @override | ||
350 | + void retainWhere(bool Function(E) E) { | ||
351 | + _list.retainWhere(E); | ||
352 | + } | ||
353 | + | ||
354 | + @override | ||
355 | + Set<E> union(Set<E> other) { | ||
356 | + return _list.union(other); | ||
357 | + } | ||
358 | +} | ||
359 | + | ||
360 | +extension SetExtension<E> on Set<E> { | ||
361 | + RxSet<E> get obs { | ||
362 | + if (this != null) | ||
363 | + return RxSet<E>(<E>{})..addAllNonNull(this); | ||
364 | + else | ||
365 | + return RxSet<E>(null); | ||
366 | + } | ||
367 | +} |
1 | import 'package:flutter/widgets.dart'; | 1 | import 'package:flutter/widgets.dart'; |
2 | -import 'package:get/src/state_manager/rx/rx_obx.dart'; | 2 | +import 'package:get/src/state_manager/rx/rx_obx_widget.dart'; |
3 | import 'get_state.dart'; | 3 | import 'get_state.dart'; |
4 | 4 | ||
5 | class MixinBuilder<T extends GetxController> extends StatelessWidget { | 5 | class MixinBuilder<T extends GetxController> extends StatelessWidget { |
@@ -7,6 +7,7 @@ export 'src/state_manager/rx/rx_interface.dart'; | @@ -7,6 +7,7 @@ export 'src/state_manager/rx/rx_interface.dart'; | ||
7 | export 'src/state_manager/rx/rx_impl.dart'; | 7 | export 'src/state_manager/rx/rx_impl.dart'; |
8 | export 'src/state_manager/rx/rx_list.dart'; | 8 | export 'src/state_manager/rx/rx_list.dart'; |
9 | export 'src/state_manager/rx/rx_map.dart'; | 9 | export 'src/state_manager/rx/rx_map.dart'; |
10 | -export 'src/state_manager/rx/rx_event.dart'; | ||
11 | -export 'src/state_manager/rx/rx_obx.dart'; | ||
12 | -export 'src/state_manager/rx/rx_getbuilder.dart'; | 10 | +export 'src/state_manager/rx/rx_set.dart'; |
11 | +export 'src/state_manager/rx/rx_workers.dart'; | ||
12 | +export 'src/state_manager/rx/rx_obx_widget.dart'; | ||
13 | +export 'src/state_manager/rx/rx_getx_widget.dart'; |
-
Please register or login to post a comment