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)
//...
}
}