#Dagger #AndroidX #Fragment



Преимущественный способ доставки зависимостей в объекты является конструктор. Это позволяет гарантировать, что при создание объекта у вас есть все необходимое для его работы. К сожалению, стандартные компоненты Android системы (Activity, Fragment, Service и пр.) должны создаваться с помощью конструктора по умолчанию (без параметров) и это рушит описаный выше принцип. Например, Fragment создается сейчас так:



class MainFragment : Fragment() {



@Inject

lateinit var sampleDep: SampleDependency



override fun onAttach(context: Context) {

super.onAttach(context)

// Делаеv inject зависимостей

}

}



Проблема этого решения состоит в том, что sampleDep используется только внутри MainFragment и должна инициализировать только один раз. Было бы хорошо сделать так, чтобы sampleDep была приватной и немодифицируемой, например это выглядело бы так:



class MainFragment @Inject constructor(

private val dependency: SampleDependency

) : Fragment()



Есть изящное решение для Fragment, которое появилось в androidx.fragment версии 1.1.0 - FragmentFactory. Это позволит вам кастомизировать создание Fragment. Android команда снова показала почему AndroidX заслуживает миграции на нее.



Пример того как реализовать FragmentFactory с Dagger 2 на основе Multibindings:

https://gist.github.com/kirich1409/45dc22004246c7a9fa7c1ef282c72fbe