Showing
2 changed files
with
50 additions
and
0 deletions
| @@ -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 { | 
- 
Please register or login to post a comment