Skip to content

Instantly share code, notes, and snippets.

abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) {
protected val api by lazy {
requireActivity().application as ApiContainer
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
DaggerStockListFragmentComponent.factory()
.create(featureApi = api.getFeature()) // HERE !
.inject(this)
super.onViewCreated(view, savedInstanceState)
}
@Component(
dependencies = [
StockListFeatureApi::class
]
)
interface StockListFragmentComponent {
fun inject(target: StockListFragment)
@Component.Factory
class StockListFragment : BaseFragment(R.layout.main_stock_list_fragment) {
@Inject lateinit var factory: StockListViewModelFactory
private val binding by viewBindings(MainStockListFragmentBinding::bind)
private val viewModel by viewModels<StockListViewModel> { factory }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
DaggerStockListFragmentComponent.factory()
.create(featureApi = api.getFeature())
.inject(this)
class StockListViewModelFactory @Inject constructor(
private val provider: Provider<StockListViewModel>
) : ViewModelProvider.Factory {
@Suppress("Unchecked_Cast")
override fun <T : ViewModel> create(modelClass: Class<T>): T =
provider.get() as T
}
class StockListViewModel @Inject constructor(
private val interactor: StockListInteractor
) : ViewModel() {
}
@Component(
modules = [
StockListDataModule::class
],
dependencies = [
NetworkCoreLibApi::class
]
)
interface StockListDataComponent : StockListDataApi {
@Module(
includes = [
StockListDatabaseModule::class,
StockListNetworkModule::class
]
)
interface StockListDataModule {
@Binds
@Reusable
// :feature:stock_list:data:wiring/build.gradle.kts
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
}
android { }
@Module
object StockListNetworkModule {
@Provides
fun rest(retrofit: Retrofit): StockListRest = retrofit.create()
}