Как я могу ввести фрагмент в действие, чтобы мне не пришлось вручную создавать его экземпляр? - PullRequest
3 голосов
/ 03 апреля 2019

Я работаю над проектом Android и использую Dagger2 для Dependency Injection? Я пытаюсь внедрить фрагмент в действие, но не хочу создавать экземпляр фрагмента, , используя newInstance или new SomeFragment и хочу, чтобы экземпляр был создан кинжалом и введен.

Я также хочу знать, как я могу сделать то же самое, если я хочу передать некоторые аргументы.

1 Ответ

1 голос
/ 04 апреля 2019

Даже если вы не хотите вызывать 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 создаст экземпляр подкомпонента для вашего фрагмента, который позволит вам вводить зависимости в пределах фрагмента.

...