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