Даже если вы не хотите вызывать new
, Android будет: Вот почему Фрагмент должен иметь открытый конструктор с нулевым аргументом , потому что если вы восстанавливаете FragmentActivity из пакета, Android будет рефлексивно вызывать конструктор Fragment .
Следовательно, большинство созданных вами фрагментов не должны объявлять свои собственные конструкторы и, конечно, не должны иметь конструктор, аннотированный @Inject
, который принимает параметры: Android не будет жаловаться, пока существует открытый конструктор с нулевым аргументом, но Dagger не будет участвовать в создании вашего Фрагмента таким образом, и это уменьшит вашу способность читать и понимать ваш код, если есть два несвязанных способа создания вашего Фрагмента.
Вместо этого вы можете использовать newInstance
для создания экземпляра Fragment с аргументами, установленными в Bundle, который затем можно прочитать и развернуть в Fragment#onCreate
. Если у вас нет аргументов для передачи, вы можете явно вызвать new
, но newInstance
может быть хорошей последовательной практикой, поэтому есть меньше изменений, если Фрагмент когда-либо примет аргументы.
Чтобы получить предоставляемые Dagger зависимости в вашем экземпляре Fragment, стандартная практика заключается в [call AndroidInjection.inject(this)
или AndroidSupportInjection.inject(this)
в onAttach
, как в документах dagger.android о введении Fragment . Самый простой способ сделать это - наследовать от DaggerFragment , но вы также можете сделать это сами. Чтобы найти компонент для внедрения вашего фрагмента, AndroidSupportInjection рекурсивно проверит родительскую иерархию для фрагмента, расширяющего HasSupportFragmentInjector, затем попробует действие, а затем приложение; если вы используете стандартный дизайн для dagger.android с ContributesAndroidInjector, Dagger создаст экземпляр подкомпонента для вашего фрагмента, который позволит вам вводить зависимости в пределах фрагмента.