Fragment 工厂
自 AndroidX 发布 androidx.fragment 系列包以来,它扩展了 Android Fragment 相关的功能。
https://developer.android.com/jetpack/androidx/releases/fragment
Fragment 工厂
自 2.1.0-alpha-3 版本起,引入了 FragmentFactory,这是一个专门用于创建 Fragment 类实例的类:
https://developer.android.com/reference/kotlin/androidx/fragment/app/FragmentFactory
Koin 可以提供一个 KoinFragmentFactory 来帮助你直接注入 Fragment 实例。
设置 Fragment 工厂
首先,在你的 KoinApplication 声明中,使用 fragmentFactory() 关键字来设置一个默认的 KoinFragmentFactory 实例:
startKoin {
// setup a KoinFragmentFactory instance
fragmentFactory()
modules(...)
}声明和注入你的 Fragment
要声明一个 Fragment 实例,只需将其在你的 Koin 模块中声明为 fragment,并使用构造函数注入。
给定一个 Fragment 类:
class MyFragment(val myService: MyService) : Fragment() {
}val appModule = module {
single { MyService() }
fragment { MyFragment(get()) }
}获取你的 Fragment
在你的宿主 Activity 类中,通过 setupKoinFragmentFactory() 设置你的 Fragment 工厂:
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Koin Fragment Factory
setupKoinFragmentFactory()
super.onCreate(savedInstanceState)
//...
}
}并通过 supportFragmentManager 获取你的 Fragment:
supportFragmentManager.beginTransaction()
.replace<MyFragment>(R.id.mvvm_frame)
.commit()使用重载的可选参数来放置你的 bundle 或 tag:
supportFragmentManager.beginTransaction()
.replace<MyFragment>(
containerViewId = R.id.mvvm_frame,
args = MyBundle(),
tag = MyString()
)Fragment 工厂与 Koin 作用域
如果你想使用 Koin Activity 的作用域(Scope),你必须将你的 fragment 作为 scoped 定义声明在你的作用域内:
val appModule = module {
scope<MyActivity> {
fragment { MyFragment(get()) }
}
}并通过你的作用域设置 Koin Fragment 工厂:setupKoinFragmentFactory(lifecycleScope)
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Koin Fragment Factory
setupKoinFragmentFactory(lifecycleScope)
super.onCreate(savedInstanceState)
//...
}
}