Jonny Borges
Committed by GitHub

Merge pull request #556 from roipeker/master

fixes for Controller and improvements with extensions and BindingBuilder.
  1 +import 'package:get/get.dart';
  2 +
1 /// [Bindings] should be extended or implemented. 3 /// [Bindings] should be extended or implemented.
2 /// When using [GetMaterialApp], all [GetPage]s and navigation methods (like Get.to()) 4 /// When using [GetMaterialApp], all [GetPage]s and navigation methods (like Get.to())
3 /// have a [binding] property that takes an instance of Bindings to manage the 5 /// have a [binding] property that takes an instance of Bindings to manage the
@@ -16,11 +18,27 @@ abstract class Bindings { @@ -16,11 +18,27 @@ abstract class Bindings {
16 /// page: () => Home(), 18 /// page: () => Home(),
17 /// binding: BindingsBuilder(() => Get.put(HomeController())), 19 /// binding: BindingsBuilder(() => Get.put(HomeController())),
18 /// ), 20 /// ),
19 -/// ````  
20 -class BindingsBuilder extends Bindings { 21 +/// ```
  22 +class BindingsBuilder<T> extends Bindings {
21 /// Register your dependencies in the [builder] callback. 23 /// Register your dependencies in the [builder] callback.
22 final void Function() builder; 24 final void Function() builder;
23 25
  26 + /// Shortcut to register 1 Controller with Get.put().
  27 + ///
  28 + /// Sample:
  29 + /// ```
  30 + /// GetPage(
  31 + /// name: '/',
  32 + /// page: () => Home(),
  33 + /// binding: BindingsBuilder.put(() => HomeController()),
  34 + /// ),
  35 + /// ```
  36 + factory BindingsBuilder.put(InstanceBuilderCallback<T> builder,
  37 + {String tag, bool permanent = false}) {
  38 + return BindingsBuilder(() => GetInstance()
  39 + .put<T>(null, tag: tag, permanent: permanent, builder: builder));
  40 + }
  41 +
24 BindingsBuilder(this.builder); 42 BindingsBuilder(this.builder);
25 43
26 @override 44 @override
1 import 'dart:async'; 1 import 'dart:async';
  2 +
2 import 'package:flutter/scheduler.dart'; 3 import 'package:flutter/scheduler.dart';
  4 +
3 import '../rx_typedefs/rx_typedefs.dart'; 5 import '../rx_typedefs/rx_typedefs.dart';
4 6
5 /// This class is the foundation for all reactive (Rx) classes that makes Get 7 /// This class is the foundation for all reactive (Rx) classes that makes Get
@@ -28,8 +30,9 @@ abstract class RxInterface<T> { @@ -28,8 +30,9 @@ abstract class RxInterface<T> {
28 } 30 }
29 31
30 /// Unlike GetxController, which serves to control events on each of its pages, 32 /// Unlike GetxController, which serves to control events on each of its pages,
31 -/// GetxService is not automatically disposed. It is ideal for situations where,  
32 -/// once started, that service will remain in memory, such as Auth control for example. 33 +/// GetxService is not automatically disposed (nor can be removed with Get.delete()).
  34 +/// It is ideal for situations where, once started, that service will remain in memory,
  35 +/// such as Auth control for example. Only way to remove it is Get.reset().
33 abstract class GetxService extends DisposableInterface {} 36 abstract class GetxService extends DisposableInterface {}
34 37
35 /// Special callable class to keep the contract of a regular method, and avoid 38 /// Special callable class to keep the contract of a regular method, and avoid
@@ -66,8 +69,8 @@ abstract class DisposableInterface { @@ -66,8 +69,8 @@ abstract class DisposableInterface {
66 } 69 }
67 70
68 /// Called immediately after the widget is allocated in memory. 71 /// Called immediately after the widget is allocated in memory.
69 - /// You might use this initialize something for the controller.  
70 - void onInit() async {} 72 + /// You might use this to initialize something for the controller.
  73 + void onInit() {}
71 74
72 /// Called 1 frame after onInit(). It is the perfect place to enter navigation events, 75 /// Called 1 frame after onInit(). It is the perfect place to enter navigation events,
73 /// like snackbar, dialogs, or a new route, or async request. 76 /// like snackbar, dialogs, or a new route, or async request.
@@ -78,7 +81,7 @@ abstract class DisposableInterface { @@ -78,7 +81,7 @@ abstract class DisposableInterface {
78 /// Or dispose objects that can potentially create some memory leaks, 81 /// Or dispose objects that can potentially create some memory leaks,
79 /// like TextEditingControllers, AnimationControllers. 82 /// like TextEditingControllers, AnimationControllers.
80 /// Might be useful as well to persist some data on disk. 83 /// Might be useful as well to persist some data on disk.
81 - Future<void> onClose() async {} 84 + void onClose() async {}
82 } 85 }
83 86
84 /// Used like [SingleTickerProviderMixin] but only with Get Controllers. 87 /// Used like [SingleTickerProviderMixin] but only with Get Controllers.
1 import 'dart:collection'; 1 import 'dart:collection';
  2 +
2 import 'package:flutter/widgets.dart'; 3 import 'package:flutter/widgets.dart';
3 import 'package:get/src/instance/get_instance.dart'; 4 import 'package:get/src/instance/get_instance.dart';
4 import 'package:get/src/navigation/root/smart_management.dart'; 5 import 'package:get/src/navigation/root/smart_management.dart';
@@ -40,15 +41,6 @@ class GetxController extends DisposableInterface { @@ -40,15 +41,6 @@ class GetxController extends DisposableInterface {
40 } 41 }
41 42
42 void disposeKey(String key) => _updatersIds.remove(key); 43 void disposeKey(String key) => _updatersIds.remove(key);
43 -  
44 - @override  
45 - void onInit() async {}  
46 -  
47 - @override  
48 - void onReady() async {}  
49 -  
50 - @override  
51 - Future<void> onClose() async {}  
52 } 44 }
53 45
54 class GetBuilder<T extends GetxController> extends StatefulWidget { 46 class GetBuilder<T extends GetxController> extends StatefulWidget {
@@ -160,7 +152,9 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> { @@ -160,7 +152,9 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> {
160 Widget build(BuildContext context) => widget.builder(controller); 152 Widget build(BuildContext context) => widget.builder(controller);
161 } 153 }
162 154
163 -/// This is a experimental feature 155 +/// This is a experimental feature.
  156 +/// Meant to be used with SimpleBuilder, it auto-registers the variable
  157 +/// like Rx() does with Obx().
164 class Value<T> extends GetxController { 158 class Value<T> extends GetxController {
165 Value([this._value]); 159 Value([this._value]);
166 T _value; 160 T _value;
  1 +import 'dart:ui';
  2 +
  3 +/// Duration utilities.
  4 +extension GetDurationUtils on Duration {
  5 + /// Utility to delay some callback (or code execution).
  6 + ///
  7 + /// Sample:
  8 + /// ```
  9 + /// void main() async {
  10 + /// final _delay = 3.seconds;
  11 + /// print('+ wait $_delay');
  12 + /// await _delay.delay();
  13 + /// print('- finish wait $_delay');
  14 + /// print('+ callback in 700ms');
  15 + /// await 0.7.seconds.delay(() {
  16 + /// }
  17 + ///```
  18 + Future delay([VoidCallback callback]) async => Future.delayed(this, callback);
  19 +}
1 export 'context_extensions.dart'; 1 export 'context_extensions.dart';
2 export 'double_extensions.dart'; 2 export 'double_extensions.dart';
  3 +export 'duration_extensions.dart';
3 export 'dynamic_extensions.dart'; 4 export 'dynamic_extensions.dart';
4 export 'num_extensions.dart'; 5 export 'num_extensions.dart';
5 export 'string_extensions.dart'; 6 export 'string_extensions.dart';
  1 +import 'dart:ui';
  2 +
1 import '../regex/get_utils.dart'; 3 import '../regex/get_utils.dart';
2 4
3 extension GetNumUtils on num { 5 extension GetNumUtils on num {
4 bool isLowerThan(num b) => GetUtils.isLowerThan(this, b); 6 bool isLowerThan(num b) => GetUtils.isLowerThan(this, b);
5 bool isGreaterThan(num b) => GetUtils.isGreaterThan(this, b); 7 bool isGreaterThan(num b) => GetUtils.isGreaterThan(this, b);
6 bool isEqual(num b) => GetUtils.isEqual(this, b); 8 bool isEqual(num b) => GetUtils.isEqual(this, b);
  9 +
  10 + /// Utility to delay some callback (or code execution).
  11 + /// TODO: Add a separated implementation of delay() with the ability
  12 + /// to stop it.
  13 + ///
  14 + /// Sample:
  15 + /// ```
  16 + /// void main() async {
  17 + /// print('+ wait for 2 seconds');
  18 + /// await 2.delay();
  19 + /// print('- 2 seconds completed');
  20 + /// print('+ callback in 1.2sec');
  21 + /// 1.delay(() => print('- 1.2sec callback called'));
  22 + /// print('currently running callback 1.2sec');
  23 + /// }
  24 + ///```
  25 + Future delay([VoidCallback callback]) async =>
  26 + Future.delayed(Duration(milliseconds: (this * 1000).round()), callback);
  27 +
  28 + /// Easy way to make Durations from numbers.
  29 + ///
  30 + /// Sample:
  31 + /// ```
  32 + /// print(1.seconds + 200.milliseconds);
  33 + /// print(1.hours + 30.minutes);
  34 + /// print(1.5.hours);
  35 + ///```
  36 + Duration get milliseconds => Duration(microseconds: (this * 1000).round());
  37 + Duration get seconds => Duration(milliseconds: (this * 1000).round());
  38 + Duration get minutes =>
  39 + Duration(seconds: (this * Duration.secondsPerMinute).round());
  40 + Duration get hours =>
  41 + Duration(minutes: (this * Duration.minutesPerHour).round());
  42 + Duration get days => Duration(hours: (this * Duration.hoursPerDay).round());
  43 +
  44 +//final _delayMaps = <Function, Future>{};
  45 +// TODO: create a proper Future and control the Timer.
  46 +// Future delay([double seconds = 0, VoidCallback callback]) async {
  47 +// final ms = (seconds * 1000).round();
  48 +// return Future.delayed(Duration(milliseconds: ms), callback);
  49 +// return _delayMaps[callback];
  50 +// }
  51 +//killDelay(VoidCallback callback) {
  52 +// if (_delayMaps.containsKey(callback)) {
  53 +// _delayMaps[callback]?.timeout(Duration.zero, onTimeout: () {
  54 +// print('callbacl eliminado!');
  55 +// });
  56 +// _delayMaps.remove(callback);
  57 +// }
  58 +//}
  59 +
7 } 60 }