メインコンテンツまでスキップ

Fragment Factory

AndroidX が Android Fragment 周辺の機能を拡張するために androidx.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 は、Fragment インスタンスを直接注入するのに役立つ KoinFragmentFactory を提供できます。

Fragment Factory のセットアップ

最初に、KoinApplication の宣言で、fragmentFactory() キーワードを使用して、デフォルトの KoinFragmentFactory インスタンスをセットアップします。

 startKoin {
// KoinFragmentFactory インスタンスをセットアップ
fragmentFactory()

modules(...)
}

Fragment の宣言と注入

Fragment インスタンスを宣言するには、Koin モジュールで fragment として宣言し、コンストラクタインジェクション (constructor injection) を使用します。

Fragment クラスが与えられた場合:

class MyFragment(val myService: MyService) : Fragment() {

}
val appModule = module {
single { MyService() }
fragment { MyFragment(get()) }
}

Fragment の取得

ホストの Activity クラスから、setupKoinFragmentFactory() で Fragment Factory をセットアップします。

class MyActivity : AppCompatActivity() {

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

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

そして、supportFragmentManagerFragment を取得します。

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 のスコープを使用したい場合は、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)
//...
}
}