跳到主要内容

Fragment 工厂

自从 AndroidX 发布了 androidx.fragment 包系列,以扩展 Android Fragment 周围的功能

https://developer.android.com/jetpack/androidx/releases/fragment

Fragment Factory

2.1.0-alpha-3 版本开始,引入了 FragmentFactory,一个专门用于创建 Fragment 类实例的类:

https://developer.android.com/reference/kotlin/androidx/fragment/app/FragmentFactory

Koin 可以提供一个 KoinFragmentFactory 来帮助你直接注入 Fragment 实例。

设置 Fragment Factory

首先,在你的 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 Factory & Koin Scopes

如果你想使用 Koin Activity 的 Scope(作用域),你必须在你的作用域内将你的 fragment 声明为 scoped 定义:

val appModule = module {
scope<MyActivity> {
fragment { MyFragment(get()) }
}
}

并使用你的作用域设置你的 Koin Fragment Factory:setupKoinFragmentFactory(lifecycleScope)

class MyActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
// Koin Fragment Factory
setupKoinFragmentFactory(lifecycleScope)

super.onCreate(savedInstanceState)
//...
}
}