Jermaine McFarlane

add lazyReplace method

@@ -139,4 +139,19 @@ extension Inst on GetInterface { @@ -139,4 +139,19 @@ extension Inst on GetInterface {
139 // ignore: unnecessary_cast 139 // ignore: unnecessary_cast
140 put(child as P, tag: tag, permanent: permanent); 140 put(child as P, tag: tag, permanent: permanent);
141 } 141 }
  142 +
  143 + /// Replaces a parent instance with a new Instance<P> lazily from the
  144 + /// [<P>builder()] callback.
  145 + /// - [tag] optional, if you use a [tag] to register the Instance.
  146 + /// - [fenix] optional
  147 + ///
  148 + /// Note: if fenix is not provided it will be set to true if
  149 + /// the parent instance was permanent
  150 + void lazyReplace<P>(InstanceBuilderCallback<P> builder,
  151 + {String? tag, bool? fenix}) {
  152 + final info = GetInstance().getInstanceInfo<P>(tag: tag);
  153 + final permanent = (info.isPermanent ?? false);
  154 + delete<P>(tag: tag, force: permanent);
  155 + lazyPut(builder, tag: tag, fenix: fenix ?? permanent);
  156 + }
142 } 157 }
@@ -160,6 +160,7 @@ void main() { @@ -160,6 +160,7 @@ void main() {
160 }); 160 });
161 161
162 group('Get.replace test for replacing parent instance that is', () { 162 group('Get.replace test for replacing parent instance that is', () {
  163 + tearDown(Get.reset);
163 test('temporary', () async { 164 test('temporary', () async {
164 Get.put(DisposableController()); 165 Get.put(DisposableController());
165 Get.replace<DisposableController>(Controller()); 166 Get.replace<DisposableController>(Controller());
@@ -203,6 +204,40 @@ void main() { @@ -203,6 +204,40 @@ void main() {
203 expect((instance as Controller).init, greaterThan(0)); 204 expect((instance as Controller).init, greaterThan(0));
204 }); 205 });
205 }); 206 });
  207 +
  208 + group('Get.lazyReplace replaces parent instance', () {
  209 + tearDown(Get.reset);
  210 + test('without fenix', () async {
  211 + Get.put(DisposableController());
  212 + Get.lazyReplace<DisposableController>(() => Controller());
  213 + final instance = Get.find<DisposableController>();
  214 + expect(instance, isA<Controller>());
  215 + expect((instance as Controller).init, greaterThan(0));
  216 + });
  217 +
  218 + test('with fenix', () async {
  219 + Get.put(DisposableController());
  220 + Get.lazyReplace<DisposableController>(() => Controller(), fenix: true);
  221 + expect(Get.find<DisposableController>(), isA<Controller>());
  222 + (Get.find<DisposableController>() as Controller).increment();
  223 +
  224 + expect((Get.find<DisposableController>() as Controller).count, 1);
  225 + Get.delete<DisposableController>();
  226 + expect((Get.find<DisposableController>() as Controller).count, 0);
  227 + });
  228 +
  229 + test('with fenix when parent is permanent', () async {
  230 + Get.put(DisposableController(), permanent: true);
  231 + Get.lazyReplace<DisposableController>(() => Controller());
  232 + final instance = Get.find<DisposableController>();
  233 + expect(instance, isA<Controller>());
  234 + (instance as Controller).increment();
  235 +
  236 + expect((Get.find<DisposableController>() as Controller).count, 1);
  237 + Get.delete<DisposableController>();
  238 + expect((Get.find<DisposableController>() as Controller).count, 0);
  239 + });
  240 + });
206 } 241 }
207 242
208 class Controller extends DisposableController { 243 class Controller extends DisposableController {