Jermaine McFarlane

add lazyReplace method

... ... @@ -139,4 +139,19 @@ extension Inst on GetInterface {
// ignore: unnecessary_cast
put(child as P, tag: tag, permanent: permanent);
}
/// Replaces a parent instance with a new Instance<P> lazily from the
/// [<P>builder()] callback.
/// - [tag] optional, if you use a [tag] to register the Instance.
/// - [fenix] optional
///
/// Note: if fenix is not provided it will be set to true if
/// the parent instance was permanent
void lazyReplace<P>(InstanceBuilderCallback<P> builder,
{String? tag, bool? fenix}) {
final info = GetInstance().getInstanceInfo<P>(tag: tag);
final permanent = (info.isPermanent ?? false);
delete<P>(tag: tag, force: permanent);
lazyPut(builder, tag: tag, fenix: fenix ?? permanent);
}
}
... ...
... ... @@ -160,6 +160,7 @@ void main() {
});
group('Get.replace test for replacing parent instance that is', () {
tearDown(Get.reset);
test('temporary', () async {
Get.put(DisposableController());
Get.replace<DisposableController>(Controller());
... ... @@ -203,6 +204,40 @@ void main() {
expect((instance as Controller).init, greaterThan(0));
});
});
group('Get.lazyReplace replaces parent instance', () {
tearDown(Get.reset);
test('without fenix', () async {
Get.put(DisposableController());
Get.lazyReplace<DisposableController>(() => Controller());
final instance = Get.find<DisposableController>();
expect(instance, isA<Controller>());
expect((instance as Controller).init, greaterThan(0));
});
test('with fenix', () async {
Get.put(DisposableController());
Get.lazyReplace<DisposableController>(() => Controller(), fenix: true);
expect(Get.find<DisposableController>(), isA<Controller>());
(Get.find<DisposableController>() as Controller).increment();
expect((Get.find<DisposableController>() as Controller).count, 1);
Get.delete<DisposableController>();
expect((Get.find<DisposableController>() as Controller).count, 0);
});
test('with fenix when parent is permanent', () async {
Get.put(DisposableController(), permanent: true);
Get.lazyReplace<DisposableController>(() => Controller());
final instance = Get.find<DisposableController>();
expect(instance, isA<Controller>());
(instance as Controller).increment();
expect((Get.find<DisposableController>() as Controller).count, 1);
Get.delete<DisposableController>();
expect((Get.find<DisposableController>() as Controller).count, 0);
});
});
}
class Controller extends DisposableController {
... ...