Jonny Borges

update to 4.3.4

  1 +## [4.3.4]
  2 +- Improve docs
  3 +
1 ## [4.3.3] 4 ## [4.3.3]
2 - Fix Get.reset 5 - Fix Get.reset
3 6
@@ -1097,6 +1097,74 @@ The only way to actually delete a `GetxService`, is with `Get.reset()` which is @@ -1097,6 +1097,74 @@ The only way to actually delete a `GetxService`, is with `Get.reset()` which is
1097 "Hot Reboot" of your app. So remember, if you need absolute persistence of a class instance during the 1097 "Hot Reboot" of your app. So remember, if you need absolute persistence of a class instance during the
1098 lifetime of your app, use `GetxService`. 1098 lifetime of your app, use `GetxService`.
1099 1099
  1100 +
  1101 +### Tests
  1102 +
  1103 +You can test your controllers like any other class, including their lifecycles:
  1104 +
  1105 +```dart
  1106 +class Controller extends GetxController {
  1107 + @override
  1108 + void onInit() {
  1109 + super.onInit();
  1110 + //Change value to name2
  1111 + name.value = 'name2';
  1112 + }
  1113 +
  1114 + @override
  1115 + void onClose() {
  1116 + name.value = '';
  1117 + super.onClose();
  1118 + }
  1119 +
  1120 + final name = 'name1'.obs;
  1121 +
  1122 + void changeName() => name.value = 'name3';
  1123 +}
  1124 +
  1125 +void main() {
  1126 + test('''
  1127 +Test the state of the reactive variable "name" across all of its lifecycles''',
  1128 + () {
  1129 + /// You can test the controller without the lifecycle,
  1130 + /// but it's not recommended unless you're not using
  1131 + /// GetX dependency injection
  1132 + final controller = Controller();
  1133 + expect(controller.name.value, 'name1');
  1134 +
  1135 + /// If you are using it, you can test everything,
  1136 + /// including the state of the application after each lifecycle.
  1137 + Get.put(controller); // onInit was called
  1138 + expect(controller.name.value, 'name2');
  1139 +
  1140 + /// Test your functions
  1141 + controller.changeName();
  1142 + expect(controller.name.value, 'name3');
  1143 +
  1144 + /// onClose was called
  1145 + Get.delete<Controller>();
  1146 +
  1147 + expect(controller.name.value, '');
  1148 + });
  1149 +}
  1150 +```
  1151 +
  1152 +#### Tips
  1153 +
  1154 +##### Mockito or mocktail
  1155 +If you need to mock your GetxController/GetxService, you should extend GetxController, and mixin it with Mock, that way
  1156 +
  1157 +```dart
  1158 +class NotificationServiceMock extends GetxService with Mock implements NotificationService {}
  1159 +```
  1160 +
  1161 +##### Using Get.reset()
  1162 +If you are testing widgets, or test groups, use Get.reset at the end of your test or in tearDown to reset all settings from your previous test.
  1163 +
  1164 +##### Get.testMode
  1165 +if you are using your navigation in your controllers, use `Get.testMode = true` at the beginning of your main.
  1166 +
  1167 +
1100 # Breaking changes from 2.0 1168 # Breaking changes from 2.0
1101 1169
1102 1- Rx types: 1170 1- Rx types:
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 /// injection, and route management in a quick and practical way. 3 /// injection, and route management in a quick and practical way.
4 library get; 4 library get;
5 5
  6 +export 'get_common/get_reset.dart';
6 export 'get_connect/connect.dart'; 7 export 'get_connect/connect.dart';
7 export 'get_core/get_core.dart'; 8 export 'get_core/get_core.dart';
8 export 'get_instance/get_instance.dart'; 9 export 'get_instance/get_instance.dart';
  1 +import '../get.dart';
  2 +
  3 +extension GetResetExt on GetInterface {
  4 + void reset(
  5 + {@deprecated bool clearFactory = true, bool clearRouteBindings = true}) {
  6 + GetInstance().resetInstance(clearRouteBindings: clearRouteBindings);
  7 + Get.clearRouteTree();
  8 + Get.clearTranslations();
  9 + Get.resetRootNavigator();
  10 + }
  11 +}
@@ -95,14 +95,14 @@ extension Inst on GetInterface { @@ -95,14 +95,14 @@ extension Inst on GetInterface {
95 /// - [clearFactory] clears the callbacks registered by `Get.lazyPut()` 95 /// - [clearFactory] clears the callbacks registered by `Get.lazyPut()`
96 /// - [clearRouteBindings] clears Instances associated with Routes when using 96 /// - [clearRouteBindings] clears Instances associated with Routes when using
97 /// [GetMaterialApp]. 97 /// [GetMaterialApp].
98 - bool reset(  
99 - {@deprecated bool clearFactory = true,  
100 - @deprecated bool clearRouteBindings = true}) =>  
101 - GetInstance().reset(  
102 - // ignore: deprecated_member_use_from_same_package  
103 - clearFactory: clearFactory,  
104 - // ignore: deprecated_member_use_from_same_package  
105 - clearRouteBindings: clearRouteBindings); 98 + // bool reset(
  99 + // {@deprecated bool clearFactory = true,
  100 + // @deprecated bool clearRouteBindings = true}) =>
  101 + // GetInstance().reset(
  102 + // // ignore: deprecated_member_use_from_same_package
  103 + // clearFactory: clearFactory,
  104 + // // ignore: deprecated_member_use_from_same_package
  105 + // clearRouteBindings: clearRouteBindings);
106 106
107 /// Deletes the `Instance<S>`, cleaning the memory and closes any open 107 /// Deletes the `Instance<S>`, cleaning the memory and closes any open
108 /// controllers (`DisposableInterface`). 108 /// controllers (`DisposableInterface`).
@@ -290,9 +290,8 @@ class GetInstance { @@ -290,9 +290,8 @@ class GetInstance {
290 /// [clearFactory] clears the callbacks registered by [lazyPut] 290 /// [clearFactory] clears the callbacks registered by [lazyPut]
291 /// [clearRouteBindings] clears Instances associated with routes. 291 /// [clearRouteBindings] clears Instances associated with routes.
292 /// 292 ///
293 - bool reset(  
294 - {@deprecated bool clearFactory = true,  
295 - @deprecated bool clearRouteBindings = true}) { 293 + bool resetInstance(
  294 + {@deprecated bool clearFactory = true, bool clearRouteBindings = true}) {
296 // if (clearFactory) _factory.clear(); 295 // if (clearFactory) _factory.clear();
297 // deleteAll(force: true); 296 // deleteAll(force: true);
298 if (clearRouteBindings) RouterReportManager.clearRouteKeys(); 297 if (clearRouteBindings) RouterReportManager.clearRouteKeys();
@@ -1014,17 +1014,17 @@ you can only use widgets and widget functions here'''; @@ -1014,17 +1014,17 @@ you can only use widgets and widget functions here''';
1014 Get.log = logWriterCallback; 1014 Get.log = logWriterCallback;
1015 } 1015 }
1016 if (defaultPopGesture != null) { 1016 if (defaultPopGesture != null) {
1017 - getxController.defaultPopGesture = defaultPopGesture; 1017 + _getxController.defaultPopGesture = defaultPopGesture;
1018 } 1018 }
1019 if (defaultOpaqueRoute != null) { 1019 if (defaultOpaqueRoute != null) {
1020 - getxController.defaultOpaqueRoute = defaultOpaqueRoute; 1020 + _getxController.defaultOpaqueRoute = defaultOpaqueRoute;
1021 } 1021 }
1022 if (defaultTransition != null) { 1022 if (defaultTransition != null) {
1023 - getxController.defaultTransition = defaultTransition; 1023 + _getxController.defaultTransition = defaultTransition;
1024 } 1024 }
1025 1025
1026 if (defaultDurationTransition != null) { 1026 if (defaultDurationTransition != null) {
1027 - getxController.defaultTransitionDuration = defaultDurationTransition; 1027 + _getxController.defaultTransitionDuration = defaultDurationTransition;
1028 } 1028 }
1029 } 1029 }
1030 1030
@@ -1050,18 +1050,18 @@ you can only use widgets and widget functions here'''; @@ -1050,18 +1050,18 @@ you can only use widgets and widget functions here''';
1050 engine!.performReassemble(); 1050 engine!.performReassemble();
1051 } 1051 }
1052 1052
1053 - void appUpdate() => getxController.update(); 1053 + void appUpdate() => _getxController.update();
1054 1054
1055 void changeTheme(ThemeData theme) { 1055 void changeTheme(ThemeData theme) {
1056 - getxController.setTheme(theme); 1056 + _getxController.setTheme(theme);
1057 } 1057 }
1058 1058
1059 void changeThemeMode(ThemeMode themeMode) { 1059 void changeThemeMode(ThemeMode themeMode) {
1060 - getxController.setThemeMode(themeMode); 1060 + _getxController.setThemeMode(themeMode);
1061 } 1061 }
1062 1062
1063 GlobalKey<NavigatorState>? addKey(GlobalKey<NavigatorState> newKey) { 1063 GlobalKey<NavigatorState>? addKey(GlobalKey<NavigatorState> newKey) {
1064 - return getxController.addKey(newKey); 1064 + return _getxController.addKey(newKey);
1065 } 1065 }
1066 1066
1067 GlobalKey<NavigatorState>? nestedKey(dynamic key) { 1067 GlobalKey<NavigatorState>? nestedKey(dynamic key) {
@@ -1206,45 +1206,49 @@ you can only use widgets and widget functions here'''; @@ -1206,45 +1206,49 @@ you can only use widgets and widget functions here''';
1206 // /// give access to Immutable MediaQuery.of(context).size.width 1206 // /// give access to Immutable MediaQuery.of(context).size.width
1207 // double get width => MediaQuery.of(context).size.width; 1207 // double get width => MediaQuery.of(context).size.width;
1208 1208
1209 - GlobalKey<NavigatorState> get key => getxController.key; 1209 + GlobalKey<NavigatorState> get key => _getxController.key;
1210 1210
1211 - Map<dynamic, GlobalKey<NavigatorState>> get keys => getxController.keys; 1211 + Map<dynamic, GlobalKey<NavigatorState>> get keys => _getxController.keys;
1212 1212
1213 - GetMaterialController get rootController => getxController; 1213 + GetMaterialController get rootController => _getxController;
1214 1214
1215 - bool get defaultPopGesture => getxController.defaultPopGesture;  
1216 - bool get defaultOpaqueRoute => getxController.defaultOpaqueRoute; 1215 + bool get defaultPopGesture => _getxController.defaultPopGesture;
  1216 + bool get defaultOpaqueRoute => _getxController.defaultOpaqueRoute;
1217 1217
1218 - Transition? get defaultTransition => getxController.defaultTransition; 1218 + Transition? get defaultTransition => _getxController.defaultTransition;
1219 1219
1220 Duration get defaultTransitionDuration { 1220 Duration get defaultTransitionDuration {
1221 - return getxController.defaultTransitionDuration; 1221 + return _getxController.defaultTransitionDuration;
1222 } 1222 }
1223 1223
1224 - Curve get defaultTransitionCurve => getxController.defaultTransitionCurve; 1224 + Curve get defaultTransitionCurve => _getxController.defaultTransitionCurve;
1225 1225
1226 Curve get defaultDialogTransitionCurve { 1226 Curve get defaultDialogTransitionCurve {
1227 - return getxController.defaultDialogTransitionCurve; 1227 + return _getxController.defaultDialogTransitionCurve;
1228 } 1228 }
1229 1229
1230 Duration get defaultDialogTransitionDuration { 1230 Duration get defaultDialogTransitionDuration {
1231 - return getxController.defaultDialogTransitionDuration; 1231 + return _getxController.defaultDialogTransitionDuration;
1232 } 1232 }
1233 1233
1234 - Routing get routing => getxController.routing; 1234 + Routing get routing => _getxController.routing;
1235 1235
1236 - Map<String, String?> get parameters => getxController.parameters; 1236 + Map<String, String?> get parameters => _getxController.parameters;
1237 set parameters(Map<String, String?> newParameters) => 1237 set parameters(Map<String, String?> newParameters) =>
1238 - getxController.parameters = newParameters; 1238 + _getxController.parameters = newParameters;
1239 1239
1240 - CustomTransition? get customTransition => getxController.customTransition; 1240 + CustomTransition? get customTransition => _getxController.customTransition;
1241 set customTransition(CustomTransition? newTransition) => 1241 set customTransition(CustomTransition? newTransition) =>
1242 - getxController.customTransition = newTransition; 1242 + _getxController.customTransition = newTransition;
1243 1243
1244 - bool get testMode => getxController.testMode;  
1245 - set testMode(bool isTest) => getxController.testMode = isTest; 1244 + bool get testMode => _getxController.testMode;
  1245 + set testMode(bool isTest) => _getxController.testMode = isTest;
1246 1246
1247 - static GetMaterialController getxController = GetMaterialController(); 1247 + void resetRootNavigator() {
  1248 + _getxController = GetMaterialController();
  1249 + }
  1250 +
  1251 + static GetMaterialController _getxController = GetMaterialController();
1248 } 1252 }
1249 1253
1250 extension NavTwoExt on GetInterface { 1254 extension NavTwoExt on GetInterface {
@@ -1252,6 +1256,10 @@ extension NavTwoExt on GetInterface { @@ -1252,6 +1256,10 @@ extension NavTwoExt on GetInterface {
1252 routeTree.addRoutes(getPages); 1256 routeTree.addRoutes(getPages);
1253 } 1257 }
1254 1258
  1259 + void clearRouteTree() {
  1260 + _routeTree.routes.clear();
  1261 + }
  1262 +
1255 static late final _routeTree = ParseRouteTree(routes: []); 1263 static late final _routeTree = ParseRouteTree(routes: []);
1256 1264
1257 ParseRouteTree get routeTree => _routeTree; 1265 ParseRouteTree get routeTree => _routeTree;
@@ -57,8 +57,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> @@ -57,8 +57,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig>
57 final List<NavigatorObserver>? navigatorObservers; 57 final List<NavigatorObserver>? navigatorObservers;
58 final TransitionDelegate<dynamic>? transitionDelegate; 58 final TransitionDelegate<dynamic>? transitionDelegate;
59 59
60 - GlobalKey<NavigatorState> get navigatorKey =>  
61 - GetNavigation.getxController.key; 60 + GlobalKey<NavigatorState> get navigatorKey => Get.key;
62 61
63 GetDelegate({ 62 GetDelegate({
64 GetPage? notFoundRoute, 63 GetPage? notFoundRoute,
@@ -34,6 +34,7 @@ class RouterReportManager<T> { @@ -34,6 +34,7 @@ class RouterReportManager<T> {
34 34
35 static void clearRouteKeys() { 35 static void clearRouteKeys() {
36 _routesKey.clear(); 36 _routesKey.clear();
  37 + _routesByCreate.clear();
37 } 38 }
38 39
39 static void appendRouteByCreate(GetLifeCycleBase i) { 40 static void appendRouteByCreate(GetLifeCycleBase i) {
@@ -96,6 +96,10 @@ extension LocalesIntl on GetInterface { @@ -96,6 +96,10 @@ extension LocalesIntl on GetInterface {
96 translations.addAll(tr); 96 translations.addAll(tr);
97 } 97 }
98 98
  99 + void clearTranslations() {
  100 + translations.clear();
  101 + }
  102 +
99 void appendTranslations(Map<String, Map<String, String>> tr) { 103 void appendTranslations(Map<String, Map<String, String>> tr) {
100 tr.forEach((key, map) { 104 tr.forEach((key, map) {
101 if (translations.containsKey(key)) { 105 if (translations.containsKey(key)) {
1 name: get 1 name: get
2 description: Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX. 2 description: Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX.
3 -version: 4.3.3 3 +version: 4.3.4
4 homepage: https://github.com/jonataslaw/getx 4 homepage: https://github.com/jonataslaw/getx
5 5
6 environment: 6 environment: