Nah, there's nothing wrong with fetching in the constructor if and only if you are emitting data from the view model using LiveData or StateFlow. In those cases the observer can connect and disconnect from the view model as it needs to.
The view model has no reference to any sort of callback. The observer pattern is what makes this shine here. (LiveData for Java or StateFlow for Kotlin.)
If the view model needs to wait for something external to tell it to start pulling data you're doing it wrong.
If you want to control whether work is done right away or not you can use shared flow and the `started` param to start the upstream flows lazily.
When I see view models with a public "init" or "start" method I consider those to be anti-patterns.