Showing
6 changed files
with
88 additions
and
27 deletions
| 1 | +## [3.2.0] | ||
| 2 | +- Improve GetBuilder ram usage | ||
| 3 | +- Added method update to Rx | ||
| 4 | +Now you no longer need to make an entire class reactive to get an element update from it, you can simply call the update method of its instance, like this: | ||
| 5 | +```dart | ||
| 6 | +class User{ | ||
| 7 | + User(this.name = '', this.age = 0); | ||
| 8 | + String name; | ||
| 9 | + int age; | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | +final user = User().obs; | ||
| 13 | + | ||
| 14 | +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) | ||
| 15 | + | ||
| 16 | +// To update: | ||
| 17 | +user.update((user){ | ||
| 18 | +user.name = 'Jonny'; | ||
| 19 | +user.age = 18; | ||
| 20 | +}); | ||
| 21 | +``` | ||
| 22 | + | ||
| 23 | +Now is also possible to access a value without using the ".value". Just open and close parentheses. | ||
| 24 | +In the previous example, you could do: | ||
| 25 | +```dart | ||
| 26 | +user().name; // before: user.value.name | ||
| 27 | +``` | ||
| 28 | +And it is also possible to set a value without using the value, inserting the value directly into the variable. | ||
| 29 | +```dart | ||
| 30 | +user(User('João', 35)); // before: user.value = User('João', 35) | ||
| 31 | +``` | ||
| 32 | +Added fenix mode to Get.lazyPut. | ||
| 33 | + | ||
| 34 | + | ||
| 1 | ## [3.1.4] | 35 | ## [3.1.4] |
| 2 | - Update readme banner | 36 | - Update readme banner |
| 3 | 37 |
| @@ -48,16 +48,15 @@ class GetImpl implements GetService { | @@ -48,16 +48,15 @@ class GetImpl implements GetService { | ||
| 48 | Bindings binding, | 48 | Bindings binding, |
| 49 | preventDuplicates = true, | 49 | preventDuplicates = true, |
| 50 | bool popGesture}) { | 50 | bool popGesture}) { |
| 51 | - if (preventDuplicates && | ||
| 52 | - '/' + page.toString().toLowerCase() == currentRoute) { | 51 | + if (preventDuplicates && '/${page.runtimeType}' == currentRoute) { |
| 53 | return null; | 52 | return null; |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | return global(id).currentState.push(GetPageRoute( | 55 | return global(id).currentState.push(GetPageRoute( |
| 57 | opaque: opaque ?? true, | 56 | opaque: opaque ?? true, |
| 58 | page: () => page, | 57 | page: () => page, |
| 59 | - settings: RouteSettings( | ||
| 60 | - name: '/' + page.toString().toLowerCase(), arguments: arguments), | 58 | + settings: |
| 59 | + RouteSettings(name: '/${page.runtimeType}', arguments: arguments), | ||
| 61 | popGesture: popGesture ?? defaultPopGesture, | 60 | popGesture: popGesture ?? defaultPopGesture, |
| 62 | transition: transition ?? defaultTransition, | 61 | transition: transition ?? defaultTransition, |
| 63 | fullscreenDialog: fullscreenDialog, | 62 | fullscreenDialog: fullscreenDialog, |
| @@ -183,16 +182,15 @@ class GetImpl implements GetService { | @@ -183,16 +182,15 @@ class GetImpl implements GetService { | ||
| 183 | bool fullscreenDialog = false, | 182 | bool fullscreenDialog = false, |
| 184 | preventDuplicates = true, | 183 | preventDuplicates = true, |
| 185 | Duration duration}) { | 184 | Duration duration}) { |
| 186 | - if (preventDuplicates && | ||
| 187 | - '/' + page.toString().toLowerCase() == currentRoute) { | 185 | + if (preventDuplicates && '/${page.runtimeType}' == currentRoute) { |
| 188 | return null; | 186 | return null; |
| 189 | } | 187 | } |
| 190 | return global(id).currentState.pushReplacement(GetPageRoute( | 188 | return global(id).currentState.pushReplacement(GetPageRoute( |
| 191 | opaque: opaque ?? true, | 189 | opaque: opaque ?? true, |
| 192 | page: () => page, | 190 | page: () => page, |
| 193 | binding: binding, | 191 | binding: binding, |
| 194 | - settings: RouteSettings( | ||
| 195 | - name: '/' + page.toString().toLowerCase(), arguments: arguments), | 192 | + settings: |
| 193 | + RouteSettings(name: '/${page.runtimeType}', arguments: arguments), | ||
| 196 | fullscreenDialog: fullscreenDialog, | 194 | fullscreenDialog: fullscreenDialog, |
| 197 | popGesture: popGesture ?? defaultPopGesture, | 195 | popGesture: popGesture ?? defaultPopGesture, |
| 198 | transition: transition ?? defaultTransition, | 196 | transition: transition ?? defaultTransition, |
| @@ -218,9 +216,8 @@ class GetImpl implements GetService { | @@ -218,9 +216,8 @@ class GetImpl implements GetService { | ||
| 218 | popGesture: popGesture ?? defaultPopGesture, | 216 | popGesture: popGesture ?? defaultPopGesture, |
| 219 | page: () => page, | 217 | page: () => page, |
| 220 | binding: binding, | 218 | binding: binding, |
| 221 | - settings: RouteSettings( | ||
| 222 | - name: '/' + page.runtimeType.toString().toLowerCase(), | ||
| 223 | - arguments: arguments), | 219 | + settings: |
| 220 | + RouteSettings(name: '/${page.runtimeType}', arguments: arguments), | ||
| 224 | fullscreenDialog: fullscreenDialog, | 221 | fullscreenDialog: fullscreenDialog, |
| 225 | transition: transition ?? defaultTransition, | 222 | transition: transition ?? defaultTransition, |
| 226 | duration: duration ?? defaultDurationTransition, | 223 | duration: duration ?? defaultDurationTransition, |
| @@ -5,13 +5,19 @@ import 'package:get/src/typedefs/typedefs.dart'; | @@ -5,13 +5,19 @@ import 'package:get/src/typedefs/typedefs.dart'; | ||
| 5 | class GetConfig { | 5 | class GetConfig { |
| 6 | //////////// INSTANCE MANAGER | 6 | //////////// INSTANCE MANAGER |
| 7 | static Map<dynamic, dynamic> _singl = {}; | 7 | static Map<dynamic, dynamic> _singl = {}; |
| 8 | - static Map<dynamic, FcBuilderFunc> _factory = {}; | 8 | + static Map<dynamic, Lazy> _factory = {}; |
| 9 | static Map<String, String> routesKey = {}; | 9 | static Map<String, String> routesKey = {}; |
| 10 | static SmartManagement smartManagement = SmartManagement.full; | 10 | static SmartManagement smartManagement = SmartManagement.full; |
| 11 | static bool isLogEnable = true; | 11 | static bool isLogEnable = true; |
| 12 | static String currentRoute; | 12 | static String currentRoute; |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | +class Lazy { | ||
| 16 | + Lazy(this.builder, this.fenix); | ||
| 17 | + bool fenix; | ||
| 18 | + FcBuilderFunc builder; | ||
| 19 | +} | ||
| 20 | + | ||
| 15 | class GetInstance { | 21 | class GetInstance { |
| 16 | factory GetInstance() { | 22 | factory GetInstance() { |
| 17 | if (_getInstance == null) _getInstance = GetInstance._(); | 23 | if (_getInstance == null) _getInstance = GetInstance._(); |
| @@ -20,9 +26,10 @@ class GetInstance { | @@ -20,9 +26,10 @@ class GetInstance { | ||
| 20 | GetInstance._(); | 26 | GetInstance._(); |
| 21 | static GetInstance _getInstance; | 27 | static GetInstance _getInstance; |
| 22 | 28 | ||
| 23 | - void lazyPut<S>(FcBuilderFunc builder, {String tag}) { | 29 | + void lazyPut<S>(FcBuilderFunc builder, {String tag, bool fenix = false}) { |
| 24 | String key = _getKey(S, tag); | 30 | String key = _getKey(S, tag); |
| 25 | - GetConfig._factory.putIfAbsent(key, () => builder); | 31 | + |
| 32 | + GetConfig._factory.putIfAbsent(key, () => Lazy(builder, fenix)); | ||
| 26 | } | 33 | } |
| 27 | 34 | ||
| 28 | Future<S> putAsync<S>(FcBuilderFuncAsync<S> builder, | 35 | Future<S> putAsync<S>(FcBuilderFuncAsync<S> builder, |
| @@ -154,7 +161,7 @@ class GetInstance { | @@ -154,7 +161,7 @@ class GetInstance { | ||
| 154 | 161 | ||
| 155 | if (GetConfig.isLogEnable) | 162 | if (GetConfig.isLogEnable) |
| 156 | print('[GET] $S instance was created at that time'); | 163 | print('[GET] $S instance was created at that time'); |
| 157 | - S _value = put<S>(GetConfig._factory[key].call() as S); | 164 | + S _value = put<S>(GetConfig._factory[key].builder() as S); |
| 158 | 165 | ||
| 159 | if (!isDependencyInit<S>() && | 166 | if (!isDependencyInit<S>() && |
| 160 | GetConfig.smartManagement != SmartManagement.onlyBuilder) { | 167 | GetConfig.smartManagement != SmartManagement.onlyBuilder) { |
| @@ -163,8 +170,10 @@ class GetInstance { | @@ -163,8 +170,10 @@ class GetInstance { | ||
| 163 | } | 170 | } |
| 164 | 171 | ||
| 165 | if (GetConfig.smartManagement != SmartManagement.keepFactory) { | 172 | if (GetConfig.smartManagement != SmartManagement.keepFactory) { |
| 173 | + if (!GetConfig._factory[key].fenix) { | ||
| 166 | GetConfig._factory.remove(key); | 174 | GetConfig._factory.remove(key); |
| 167 | } | 175 | } |
| 176 | + } | ||
| 168 | 177 | ||
| 169 | if (callInit) { | 178 | if (callInit) { |
| 170 | initController<S>(tag: tag); | 179 | initController<S>(tag: tag); |
| 1 | import 'dart:async'; | 1 | import 'dart:async'; |
| 2 | +import 'dart:collection'; | ||
| 2 | import 'rx_interface.dart'; | 3 | import 'rx_interface.dart'; |
| 3 | 4 | ||
| 4 | class _RxImpl<T> implements RxInterface<T> { | 5 | class _RxImpl<T> implements RxInterface<T> { |
| 5 | StreamController<T> subject = StreamController<T>.broadcast(); | 6 | StreamController<T> subject = StreamController<T>.broadcast(); |
| 6 | - Map<Stream<T>, StreamSubscription> _subscriptions = Map(); | 7 | + HashMap<Stream<T>, StreamSubscription> _subscriptions = |
| 8 | + HashMap<Stream<T>, StreamSubscription>(); | ||
| 7 | 9 | ||
| 8 | T _value; | 10 | T _value; |
| 9 | T get value { | 11 | T get value { |
| @@ -13,6 +15,18 @@ class _RxImpl<T> implements RxInterface<T> { | @@ -13,6 +15,18 @@ class _RxImpl<T> implements RxInterface<T> { | ||
| 13 | return _value; | 15 | return _value; |
| 14 | } | 16 | } |
| 15 | 17 | ||
| 18 | + T call([T v]) { | ||
| 19 | + if (v != null) { | ||
| 20 | + this.value = v; | ||
| 21 | + } | ||
| 22 | + return this.value; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + void update(void fn(T value)) { | ||
| 26 | + fn(value); | ||
| 27 | + subject.add(value); | ||
| 28 | + } | ||
| 29 | + | ||
| 16 | String get string => value.toString(); | 30 | String get string => value.toString(); |
| 17 | 31 | ||
| 18 | close() { | 32 | close() { |
| @@ -354,6 +368,11 @@ class RxList<E> extends Iterable<E> implements RxInterface<E> { | @@ -354,6 +368,11 @@ class RxList<E> extends Iterable<E> implements RxInterface<E> { | ||
| 354 | add(item); | 368 | add(item); |
| 355 | } | 369 | } |
| 356 | 370 | ||
| 371 | + void update(void fn(Iterable<E> value)) { | ||
| 372 | + fn(value); | ||
| 373 | + subject.add(null); | ||
| 374 | + } | ||
| 375 | + | ||
| 357 | /// Replaces all existing items of this list with [items] | 376 | /// Replaces all existing items of this list with [items] |
| 358 | void assignAll(Iterable<E> items) { | 377 | void assignAll(Iterable<E> items) { |
| 359 | clear(); | 378 | clear(); |
| @@ -473,5 +492,5 @@ extension ListExtension<E> on List<E> { | @@ -473,5 +492,5 @@ extension ListExtension<E> on List<E> { | ||
| 473 | } | 492 | } |
| 474 | 493 | ||
| 475 | extension RxT<T> on T { | 494 | extension RxT<T> on T { |
| 476 | - Rx<T> get obs => Rx(this); | 495 | + Rx<T> get obs => Rx<T>(this); |
| 477 | } | 496 | } |
| @@ -5,18 +5,18 @@ import 'package:get/src/root/smart_management.dart'; | @@ -5,18 +5,18 @@ import 'package:get/src/root/smart_management.dart'; | ||
| 5 | import 'package:get/src/rx/rx_interface.dart'; | 5 | import 'package:get/src/rx/rx_interface.dart'; |
| 6 | 6 | ||
| 7 | class GetxController extends DisposableInterface { | 7 | class GetxController extends DisposableInterface { |
| 8 | - final HashSet<Updater> _updaters = HashSet<Updater>(); | 8 | + final HashSet<UpdaterBuilder> _updaters = HashSet<UpdaterBuilder>(); |
| 9 | 9 | ||
| 10 | /// Update GetBuilder with update(); | 10 | /// Update GetBuilder with update(); |
| 11 | void update([List<String> ids, bool condition = true]) { | 11 | void update([List<String> ids, bool condition = true]) { |
| 12 | if (!condition) return; | 12 | if (!condition) return; |
| 13 | (ids == null) | 13 | (ids == null) |
| 14 | ? _updaters.forEach((rs) { | 14 | ? _updaters.forEach((rs) { |
| 15 | - rs.updater(() {}); | 15 | + rs().updater(() {}); |
| 16 | }) | 16 | }) |
| 17 | : _updaters | 17 | : _updaters |
| 18 | - .where((element) => ids.contains(element.id)) | ||
| 19 | - .forEach((rs) => rs.updater(() {})); | 18 | + .where((element) => ids.contains(element().id)) |
| 19 | + .forEach((rs) => rs().updater(() {})); | ||
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | @override | 22 | @override |
| @@ -60,7 +60,7 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | @@ -60,7 +60,7 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | ||
| 60 | 60 | ||
| 61 | class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> { | 61 | class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> { |
| 62 | T controller; | 62 | T controller; |
| 63 | - Updater real; | 63 | + UpdaterBuilder real; |
| 64 | bool isCreator = false; | 64 | bool isCreator = false; |
| 65 | @override | 65 | @override |
| 66 | void initState() { | 66 | void initState() { |
| @@ -75,24 +75,24 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> { | @@ -75,24 +75,24 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> { | ||
| 75 | isCreator = true; | 75 | isCreator = true; |
| 76 | } | 76 | } |
| 77 | controller = GetInstance().find<T>(tag: widget.tag); | 77 | controller = GetInstance().find<T>(tag: widget.tag); |
| 78 | - real = Updater(updater: setState, id: widget.id); | 78 | + real = () => Updater(updater: setState, id: widget.id); |
| 79 | controller._updaters.add(real); | 79 | controller._updaters.add(real); |
| 80 | } else if (isRegistred) { | 80 | } else if (isRegistred) { |
| 81 | controller = GetInstance().find<T>(tag: widget.tag); | 81 | controller = GetInstance().find<T>(tag: widget.tag); |
| 82 | isCreator = false; | 82 | isCreator = false; |
| 83 | - real = Updater(updater: setState, id: widget.id); | 83 | + real = () => Updater(updater: setState, id: widget.id); |
| 84 | controller._updaters.add(real); | 84 | controller._updaters.add(real); |
| 85 | } else { | 85 | } else { |
| 86 | controller = widget.init; | 86 | controller = widget.init; |
| 87 | isCreator = true; | 87 | isCreator = true; |
| 88 | - real = Updater(updater: setState, id: widget.id); | 88 | + real = () => Updater(updater: setState, id: widget.id); |
| 89 | controller._updaters.add(real); | 89 | controller._updaters.add(real); |
| 90 | GetInstance().put<T>(controller, tag: widget.tag); | 90 | GetInstance().put<T>(controller, tag: widget.tag); |
| 91 | } | 91 | } |
| 92 | } else { | 92 | } else { |
| 93 | controller = widget.init; | 93 | controller = widget.init; |
| 94 | isCreator = true; | 94 | isCreator = true; |
| 95 | - real = Updater(updater: setState, id: widget.id); | 95 | + real = () => Updater(updater: setState, id: widget.id); |
| 96 | controller._updaters.add(real); | 96 | controller._updaters.add(real); |
| 97 | controller?.onStart(); | 97 | controller?.onStart(); |
| 98 | } | 98 | } |
| @@ -141,3 +141,5 @@ class Updater { | @@ -141,3 +141,5 @@ class Updater { | ||
| 141 | final String id; | 141 | final String id; |
| 142 | const Updater({this.updater, this.id}); | 142 | const Updater({this.updater, this.id}); |
| 143 | } | 143 | } |
| 144 | + | ||
| 145 | +typedef UpdaterBuilder = Updater Function(); |
| 1 | name: get | 1 | name: get |
| 2 | description: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get. | 2 | description: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get. |
| 3 | -version: 3.1.4 | 3 | +version: 3.2.0 |
| 4 | homepage: https://github.com/jonataslaw/get | 4 | homepage: https://github.com/jonataslaw/get |
| 5 | 5 | ||
| 6 | environment: | 6 | environment: |
-
Please register or login to post a comment