Fragment Factory
Since AndroidX has released androidx.fragment packages family to extend features around Android Fragment
https://developer.android.com/jetpack/androidx/releases/fragment
Fragment Factory
Since 2.1.0-alpha-3 version, has been introduced the FragmentFactory, a class dedicated to create instance of Fragment class:
https://developer.android.com/reference/kotlin/androidx/fragment/app/FragmentFactory
Koin can bring a KoinFragmentFactory to help you inject your Fragment instances directly.
Setup Fragment Factory
At start, in your KoinApplication declaration, use the fragmentFactory() keyword to setting up a default KoinFragmentFactory instance:
startKoin {
// setup a KoinFragmentFactory instance
fragmentFactory()
modules(...)
}
Declare & Inject your Fragment
To declare a Fragment instance, just declare it as a fragment in your Koin module and use constructor injection.
Given a Fragment class:
class MyFragment(val myService: MyService) : Fragment() {
}
val appModule = module {
single { MyService() }
fragment { MyFragment(get()) }
}
Get your Fragment
From your host Activity class, setting up your fragment factory with setupKoinFragmentFactory():
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Koin Fragment Factory
setupKoinFragmentFactory()
super.onCreate(savedInstanceState)
//...
}
}
And retrieve your Fragment with your supportFragmentManager:
supportFragmentManager.beginTransaction()
.replace<MyFragment>(R.id.mvvm_frame)
.commit()
Put your bundle or tag using the overloaded optional params:
supportFragmentManager.beginTransaction()
.replace<MyFragment>(
containerViewId = R.id.mvvm_frame,
args = MyBundle(),
tag = MyString()
)
Fragment Factory & Koin Scopes
If you want to use the Koin Activity's Scope, you have to declare your fragment inside your scope as a scoped definition:
val appModule = module {
scope<MyActivity> {
fragment { MyFragment(get()) }
}
}
and setting up your Koin Fragment Factory with your scope: setupKoinFragmentFactory(lifecycleScope)
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Koin Fragment Factory
setupKoinFragmentFactory(lifecycleScope)
super.onCreate(savedInstanceState)
//...
}
}