Jonatas

added reload dependency, reloadAll, InstanceInfo and fix ui fail when navigate to same route

1 import 'dart:async'; 1 import 'dart:async';
2 import 'dart:collection'; 2 import 'dart:collection';
3 3
  4 +import 'package:flutter/foundation.dart';
  5 +
4 import '../../get_core/get_core.dart'; 6 import '../../get_core/get_core.dart';
5 7
6 import 'lifecycle.dart'; 8 import 'lifecycle.dart';
7 9
  10 +class InstanceInfo {
  11 + final bool isPermanent;
  12 + final bool isSingleton;
  13 + bool get isCreate => !isSingleton;
  14 + final bool isRegistered;
  15 + final bool isPrepared;
  16 + final bool isInit;
  17 + const InstanceInfo({
  18 + @required this.isPermanent,
  19 + @required this.isSingleton,
  20 + @required this.isRegistered,
  21 + @required this.isPrepared,
  22 + @required this.isInit,
  23 + });
  24 +}
  25 +
8 class GetInstance { 26 class GetInstance {
9 factory GetInstance() => _getInstance ??= GetInstance._(); 27 factory GetInstance() => _getInstance ??= GetInstance._();
10 28
@@ -156,8 +174,13 @@ class GetInstance { @@ -156,8 +174,13 @@ class GetInstance {
156 final key = _getKey(S, name); 174 final key = _getKey(S, name);
157 _singl.putIfAbsent( 175 _singl.putIfAbsent(
158 key, 176 key,
159 - () =>  
160 - _InstanceBuilderFactory<S>(isSingleton, builder, permanent, false)); 177 + () => _InstanceBuilderFactory<S>(
  178 + isSingleton,
  179 + builder,
  180 + permanent,
  181 + false,
  182 + ),
  183 + );
161 } 184 }
162 185
163 /// Clears from memory registered Instances associated with [routeName] when 186 /// Clears from memory registered Instances associated with [routeName] when
@@ -226,6 +249,29 @@ class GetInstance { @@ -226,6 +249,29 @@ class GetInstance {
226 _routesKey.putIfAbsent(_getKey(S, tag), () => Get.reference); 249 _routesKey.putIfAbsent(_getKey(S, tag), () => Get.reference);
227 } 250 }
228 251
  252 + InstanceInfo getInstanceInfo<S>({String tag}) {
  253 + final build = _getDependency<S>(tag: tag);
  254 +
  255 + return InstanceInfo(
  256 + isPermanent: build?.permanent,
  257 + isSingleton: build?.isSingleton,
  258 + isRegistered: isRegistered<S>(tag: tag),
  259 + isPrepared: !(build?.isInit ?? true),
  260 + isInit: build?.isInit,
  261 + );
  262 + }
  263 +
  264 + _InstanceBuilderFactory _getDependency<S>({String tag, String key}) {
  265 + final newKey = key ?? _getKey(S, tag);
  266 +
  267 + if (!_singl.containsKey(newKey)) {
  268 + Get.log('Instance "$newKey" is not registered.', isError: true);
  269 + return null;
  270 + } else {
  271 + return _singl[newKey];
  272 + }
  273 + }
  274 +
229 /// Initializes the controller 275 /// Initializes the controller
230 S _startController<S>({String tag}) { 276 S _startController<S>({String tag}) {
231 final key = _getKey(S, tag); 277 final key = _getKey(S, tag);
@@ -316,12 +362,6 @@ class GetInstance { @@ -316,12 +362,6 @@ class GetInstance {
316 /// the Instance. **don't use** it unless you know what you are doing. 362 /// the Instance. **don't use** it unless you know what you are doing.
317 /// - [force] Will delete an Instance even if marked as [permanent]. 363 /// - [force] Will delete an Instance even if marked as [permanent].
318 bool delete<S>({String tag, String key, bool force = false}) { 364 bool delete<S>({String tag, String key, bool force = false}) {
319 - // return _queue.secure<bool>(() {  
320 - return _delete<S>(tag: tag, key: key, force: force);  
321 - // });  
322 - }  
323 -  
324 - bool _delete<S>({String tag, String key, bool force = false}) {  
325 final newKey = key ?? _getKey(S, tag); 365 final newKey = key ?? _getKey(S, tag);
326 366
327 if (!_singl.containsKey(newKey)) { 367 if (!_singl.containsKey(newKey)) {
@@ -360,6 +400,37 @@ class GetInstance { @@ -360,6 +400,37 @@ class GetInstance {
360 return true; 400 return true;
361 } 401 }
362 402
  403 + void reloadAll({bool force = false}) {
  404 + _singl.forEach((key, value) {
  405 + if (value.permanent && !force) {
  406 + Get.log('Instance "$key" is permanent. Skipping reload');
  407 + } else {
  408 + value.dependency = null;
  409 + value.isInit = false;
  410 + Get.log('Instance "$key" was reloaded.');
  411 + }
  412 + });
  413 + }
  414 +
  415 + void reload<S>({String tag, String key, bool force = false}) {
  416 + final newKey = key ?? _getKey(S, tag);
  417 +
  418 + final builder = _getDependency<S>(tag: tag, key: newKey);
  419 + if (builder == null) return;
  420 +
  421 + if (builder.permanent && !force) {
  422 + Get.log(
  423 + '''Instance "$newKey" is permanent. Use [force = true] to force the restart.''',
  424 + isError: true,
  425 + );
  426 + return;
  427 + }
  428 +
  429 + builder.dependency = null;
  430 + builder.isInit = false;
  431 + Get.log('Instance "$newKey" was restarted.');
  432 + }
  433 +
363 /// Check if a Class Instance<[S]> (or [tag]) is registered in memory. 434 /// Check if a Class Instance<[S]> (or [tag]) is registered in memory.
364 /// - [tag] is optional, if you used a [tag] to register the Instance. 435 /// - [tag] is optional, if you used a [tag] to register the Instance.
365 bool isRegistered<S>({String tag}) => _singl.containsKey(_getKey(S, tag)); 436 bool isRegistered<S>({String tag}) => _singl.containsKey(_getKey(S, tag));
@@ -370,12 +441,11 @@ class GetInstance { @@ -370,12 +441,11 @@ class GetInstance {
370 bool isPrepared<S>({String tag}) { 441 bool isPrepared<S>({String tag}) {
371 final newKey = _getKey(S, tag); 442 final newKey = _getKey(S, tag);
372 443
373 - if (!_singl.containsKey(newKey)) {  
374 - Get.log('Instance "$newKey" not found.', isError: true); 444 + final builder = _getDependency<S>(tag: tag, key: newKey);
  445 + if (builder == null) {
375 return false; 446 return false;
376 } 447 }
377 448
378 - final builder = _singl[newKey];  
379 if (!builder.isInit) { 449 if (!builder.isInit) {
380 return true; 450 return true;
381 } 451 }
@@ -386,8 +386,11 @@ class GetPageRoute<T> extends PageRoute<T> { @@ -386,8 +386,11 @@ class GetPageRoute<T> extends PageRoute<T> {
386 void dispose() { 386 void dispose() {
387 super.dispose(); 387 super.dispose();
388 if (Get.smartManagement != SmartManagement.onlyBuilder) { 388 if (Get.smartManagement != SmartManagement.onlyBuilder) {
389 - WidgetsBinding.instance.addPostFrameCallback(  
390 - (_) => GetInstance().removeDependencyByRoute("$reference")); 389 + WidgetsBinding.instance.addPostFrameCallback((_) {
  390 + if (Get.reference != reference) {
  391 + GetInstance().removeDependencyByRoute("$reference");
  392 + }
  393 + });
391 } 394 }
392 395
393 // if (Get.smartManagement != SmartManagement.onlyBuilder) { 396 // if (Get.smartManagement != SmartManagement.onlyBuilder) {
@@ -69,10 +69,14 @@ abstract class GetWidget<S extends GetLifeCycleBase> extends GetWidgetCache { @@ -69,10 +69,14 @@ abstract class GetWidget<S extends GetLifeCycleBase> extends GetWidgetCache {
69 class _GetCache<S extends GetLifeCycleBase> extends WidgetCache<GetWidget<S>> { 69 class _GetCache<S extends GetLifeCycleBase> extends WidgetCache<GetWidget<S>> {
70 S _controller; 70 S _controller;
71 bool _isCreator = false; 71 bool _isCreator = false;
  72 + InstanceInfo info;
72 @override 73 @override
73 void onInit() { 74 void onInit() {
74 - _isCreator = Get.isPrepared<S>(tag: widget.tag);  
75 - if (Get.isPrepared<S>()) { 75 + info = GetInstance().getInstanceInfo<S>(tag: widget.tag);
  76 +
  77 + _isCreator = info.isPrepared && info.isCreate;
  78 +
  79 + if (info.isRegistered) {
76 _controller = Get.find<S>(tag: widget.tag); 80 _controller = Get.find<S>(tag: widget.tag);
77 } 81 }
78 82
@@ -90,6 +94,7 @@ class _GetCache<S extends GetLifeCycleBase> extends WidgetCache<GetWidget<S>> { @@ -90,6 +94,7 @@ class _GetCache<S extends GetLifeCycleBase> extends WidgetCache<GetWidget<S>> {
90 GetWidget._cache[widget] = null; 94 GetWidget._cache[widget] = null;
91 }); 95 });
92 } 96 }
  97 + info = null;
93 super.onClose(); 98 super.onClose();
94 } 99 }
95 100
@@ -81,6 +81,19 @@ void main() { @@ -81,6 +81,19 @@ void main() {
81 Get.reset(); 81 Get.reset();
82 }); 82 });
83 83
  84 + test('Get.reloadInstance test', () async {
  85 + Get.lazyPut<Controller>(() => Controller());
  86 + var ct1 = Get.find<Controller>();
  87 + ct1.increment();
  88 + expect(ct1.count, 1);
  89 + ct1 = Get.find<Controller>();
  90 + expect(ct1.count, 1);
  91 + GetInstance().reload<Controller>();
  92 + ct1 = Get.find<Controller>();
  93 + expect(ct1.count, 0);
  94 + Get.reset();
  95 + });
  96 +
84 test('Get.lazyPut with abstract class test', () async { 97 test('Get.lazyPut with abstract class test', () async {
85 final api = Api(); 98 final api = Api();
86 Get.lazyPut<Service>(() => api); 99 Get.lazyPut<Service>(() => api);
@@ -127,6 +140,7 @@ void main() { @@ -127,6 +140,7 @@ void main() {
127 class Controller extends DisposableController { 140 class Controller extends DisposableController {
128 int init = 0; 141 int init = 0;
129 int close = 0; 142 int close = 0;
  143 + int count = 0;
130 @override 144 @override
131 void onInit() { 145 void onInit() {
132 init++; 146 init++;
@@ -138,4 +152,8 @@ class Controller extends DisposableController { @@ -138,4 +152,8 @@ class Controller extends DisposableController {
138 close++; 152 close++;
139 super.onClose(); 153 super.onClose();
140 } 154 }
  155 +
  156 + void increment() {
  157 + count++;
  158 + }
141 } 159 }