Fragment Factory
AndroidX は、Android の Fragment 周りの機能を拡張するために androidx.fragment パッケージファミリーをリリースしました。
https://developer.android.com/jetpack/androidx/releases/fragment
Fragment Factory
バージョン 2.1.0-alpha-3 以降、Fragment クラスのインスタンスを作成するための専用クラスである FragmentFactory が導入されました。
https://developer.android.com/reference/kotlin/androidx/fragment/app/FragmentFactory
Koin は、Fragment インスタンスを直接インジェクトするのに役立つ KoinFragmentFactory を提供できます。
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() を使用してフラグメントファクトリをセットアップします。
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 スコープ
Koin の Activity スコープを使用したい場合は、Fragment をスコープ内に scoped 定義として宣言する必要があります。
val appModule = module {
scope<MyActivity> {
fragment { MyFragment(get()) }
}
}そして、setupKoinFragmentFactory(lifecycleScope) のように、スコープを使用して Koin Fragment Factory をセットアップします。
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Koin Fragment Factory
setupKoinFragmentFactory(lifecycleScope)
super.onCreate(savedInstanceState)
//...
}
}