FrProvider<VM extends FrViewModel>.di constructor

FrProvider<VM extends FrViewModel>.di({
  1. GetIt? di,
  2. dynamic onCreated(
    1. BuildContext c,
    2. VM vm
    )?,
  3. Key? key,
  4. Dispose<VM>? dispose,
  5. bool? lazy,
  6. TransitionBuilder? builder,
  7. Widget? child,
})

inject VM from GetIt container to Widget tree.

Implementation

FrProvider.di({
  GetIt? di,
  this.onCreated,
  super.key,
  Dispose<VM>? dispose,
  super.lazy,
  super.builder,
  super.child,
}) : super(
       create: (c) {
         // VM extends FrViewModel
         final vm = (di != null) ? di!<VM>() : c.read<VM>();
         onCreated?.call(c, vm);
         return vm;
       },
       dispose: (c, vm) {
         dispose?.call(c, vm);
         di ??= GetIt.I;
         final reg = di?.findFirstObjectRegistration<VM>();
         final fun = switch (reg?.registrationType) {
           null => () {},
           ObjectRegistrationType.alwaysNew => () {
             // just dispose, GetIt always return new instance
             vm.dispose();
           },
           ObjectRegistrationType.constant => () {
             log(
               'Dev Tips: '
               'You can not auto dispose `singleton`VM [${VM.runtimeType}] by FrProvider.container. '
               'Try use `FrProvider.container` with `lazySingleton` VM, '
               'or use `FrProvider.value` with `singleton` VM. ',
             );
           },
           ObjectRegistrationType.lazy => () {
             // dispose and reset lazy singleton
             vm.dispose();
             di!.resetLazySingleton<VM>();
           },
           ObjectRegistrationType.cachedFactory => () {
             // just dispose, GetIt may return new instance or VM throw `StateError`
             vm.dispose();
           },
         };
         fun.call();
       },
     );