На сайте с документации к Dagger 2 есть следующий пример кода и слова:
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
If your class has @Inject-annotated fields but no @Inject-annotated constructor, Dagger will inject those fields if requested, but will not create new instances. Add a no-argument constructor with the @Inject annotation to indicate that Dagger may create instances as well.
Что это значит? Т.е., если конструктора с @Inject не будет, как Dagger будет инжектить эти поля "if requested, but will not create new instances"?
Т.е. насколько я понимаю, тут:
class CoffeeMaker @Inject (Heater heater) {
}
если объект Heater раньше не был создан - dagger создаст новый его объект (условно говоря, heater = Heater()
), если же его объект сейчас используется другим классом, то получим тут ссылку на этот же обьект, что использует другой класс (условно говоря, heater = heaterObj
).
А что будет тут?
class CoffeeMaker {
@Inject Heater heater;
}
В случае, если объект Heater раньше не был создан? И в случае, если такой его обьект сейчас используется другим классом?
В этом случае нужно явно инжектить. Пример инжекта полей в Fragment() на андроид:
class AlbumsFragment: Fragment() {
@Inject
lateinit var mAdapter: AlbumsListAdapter
@Inject
lateinit var factory: CustomViewModelFactory
lateinit var viewModel: AlbumViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(false)
(activity?.application as App).getComponent().inject(this)
viewModel = ViewModelProviders.of(this, factory).get(AlbumViewModel::class.java)
viewModel.setAdapter(mAdapter)
mAdapter.setActivity(activity as AppCompatActivity)
}
}
Интерфейс Component:
@Component(modules = [AppModule::class])
interface ApplicationComponent {
fun inject(fragment: AlbumsFragment)
}
Что это значит? Т.е., если конструктора с @Inject не будет, как Dagger будет инжектить эти поля "if requested, but will not create new instances"?
Инициализация полей происходит после метода:
(activity?.application as App).getComponent().inject(this)
Т.е. если не будет этого вызова, поля не будут проинициализированы.
В случае, если объект Heater раньше не был создан? И в случае, если такой его обьект сейчас используется другим классом?
Если в Module() поля не обозначены как синглтоны, то будут созданы новые объекты, а если обозначены, то будет инжектится один экземпляр для всех классов.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах