Flutterando / auto_injector

Dependency injection system. But without build_runner :)
https://pub.dev/packages/auto_injector
Other
54 stars 15 forks source link

Binds type factory are not disposed #20

Closed rodrigopequeno closed 8 months ago

rodrigopequeno commented 8 months ago

In the example below, the ClassFactory is not disposed when the injector is disposed

import 'dart:async';
import 'package:auto_injector/auto_injector.dart';

class ClassFactory {
  late StreamSubscription<String> _subscription;
  final Stream<String> _controller = Stream.periodic(
    const Duration(seconds: 1),
    (i) => 'Stream: $i',
  );

  ClassFactory() {
    _subscription = _controller.listen(print);
  }

  void dispose() {
    _subscription.cancel();
  }
}

Future<void> main() async {
  final injector = AutoInjector(
    on: (i) {
      i.add<ClassFactory>(
        ClassFactory.new,
        config: BindConfig(
          onDispose: (obj) => obj.dispose(),
        ),
      );
      i.commit();
    },
  );
  injector<ClassFactory>();
  injector.dispose();

  await Future.delayed(const Duration(seconds: 20));
}
jacobaraujo7 commented 8 months ago

Olá! O dispose só funcionará em singleton. Quando usa o i.add você está criando em modo fábrica, ou seja, sempre que for chamado criará uma nova instancia. Você precisa adicionar i.addSingleton ou lazy para que o bind seja elegível para o dispose. Testei aqui e parece está funcionando com isso. Espero ter ajudado!