fluttercommunity / get_it

Get It - Simple direct Service Locator that allows to decouple the interface from a concrete implementation and to access the concrete implementation from everywhere in your App. Maintainer: @escamoteur
https://pub.dev/packages/get_it
MIT License
1.36k stars 149 forks source link

Make `registerLazySingletonAsync` have a `dependsOn` #339

Open feinstein opened 1 year ago

feinstein commented 1 year ago

registerLazySingletonAsync doesn't have a dependsOn, so we can't deal with more complex cases, where we want a lazy singleton, to avoid memory leaks, and also depend on another async singleton.

escamoteur commented 1 year ago

please explain to me how lazy singletons prevent memory leeaks

feinstein commented 1 year ago

If I have a big app, with 100 Singletons, then if I don't use lazy Singleton factories, they will all be created as soon as the app starts. Many of those Singletons might only be useful on some parts of the app, parts that the user might not even use. With lazy singletons only the Singletons that are requested will be created and live in memory, thus reducing the memory footprint.

escamoteur commented 1 year ago

That is true, but IMHO you take 1000s of Dart objects to get into memory troubles. Images are always the problem, not simple objects Am 17. Aug. 2023, 16:22 +0200 schrieb Michel Feinstein @.***>:

If I have a big app, with 100 Singletons, then if I don't use lazy Singleton factories, they will all be created as soon as the app starts. Many of those Singletons might only be useful on some parts of the app, parts that the user might not even use. With lazy singletons only the Singletons that are requested will be created and live in memory, thus reducing the memory footprint. — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

feinstein commented 1 year ago

That is true, but IMHO you take 1000s of Dart objects to get into memory troubles. Images are always the problem, not simple objects.

Yeah, but how do you know those singletons will always be simple objects? IMHO get_it is a lib for locating services, creating objects, it's up to the user to choose what the objects look like, get_it wasn't made just for simple objects.

You agree with me that it can happen, you gave me examples when this is possible to happen, so why not make get_it better support those scenarios? This is a very popular library, used by many different apps, specially very big ones, that are the ones facing this problem. Saying that get_it shouldn't be used for scenarios where we have 1000s of objects if the same as saying that get_it is only recommended for small and simple apps, which I don't think it's the case.

escamoteur commented 1 year ago

you also have to keep in mind, that I maintain several packages as the sole maintainer in my spare time. So I have to focus on feature requests that help a large group of my users and you are the first one since this package exists (and it's one of the oldest on pub) so it really doesn't seem to be a problem for the majority of my users. if this issue get more likes I will consider it but it's not a trivial change

feinstein commented 1 year ago

I think that's a fair point and I agree with you, my suggestion should not be dismissed based on personal opinions, but on technical matter, and should be implemented on a priority basis.

sebastianbuechler commented 1 year ago

First, I want to say I really like the package and appreciate the work that is put into packages like get_it. Thanks!

Second, I would also appreciate such an enhancement. For my use-case, it's mainly that some singletons should be started in a specific order (which I can do with regular singletons and async ones, but not lazy singletons or even lazy async singletons) where they only work properly if some others are already setup (classic dependencies are API services, storage services and so on). In order to not overload everything on startup it would be nice to have the lazy loading feature in that situation as well.