0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dagger-Hiltを取り除いてViewModelを手動でDIする方法を動画で学ぶ

Posted at

手動でDIを実現する方法 + Daggerを取り除く

Dagger-Hiltを使えば、viewModule()関数で任意のViewModelインスタンスを生成・取得できますが、次の動画では、ViewModelProvider.Factoryを使って手動で生成・取得を実現する方法を紹介しています。

YouTube - Full Guide to Manual Dependency Injection + Removing Dagger

Dagger-Hiltを使ったDIの例(元となるソースコード)

手動でDIを実現する方法(変更されたソースコード)

構造

AndroidManifest

applicationにMyAppクラスを、activityにMainActivityクラスを指定しています。

app\src\main\AndroidManifest.xml
    <application android:name=".MyApp" ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>

クラス図

ApplicationComponentActivityViewModelAuthRepositoryに関するクラスを次のクラス図に示します。

ViewModelの生成と取得

ViewModelProvider.Factoryを使って、任意の引数付きのViewModelを生成・取得します。

Factoryヘルパー関数

動画では、汎用的なヘルパー関数であるviewModelFactory関数が紹介されています。

ViewModelFactoryHelper.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

fun <VM: ViewModel> viewModelFactory(initializer: () -> VM): ViewModelProvider.Factory {
    return object : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            return initializer() as T
        }
    }
}

MainViewModelの生成と取得

viewModel関数とFactoryヘルパー関数とを使って、次のようにMainViewModelインスタンスを生成・取得できます。

:
import androidx.lifecycle.viewmodel.compose.viewModel
import com.plcoding.manualdependencyinjection.presentation.MainViewModel
import com.plcoding.manualdependencyinjection.presentation.viewModelFactory
:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ManualDependencyInjectionTheme {
                val viewModel = viewModel<MainViewModel>(
                    factory = viewModelFactory {
                        MainViewModel(MyApp.appModule.authRepository)
                    }
                )
                :
            }
        }
    }
}

まとめ

動画で紹介されたviewModelFactoryヘルパー関数を使って、任意の引数があるViewModelクラスのインスタンスをviewModel関数を用いて、生成・取得ができることを学びました。

補足 - ViewModelProvider.Factoryは不要

動画では、ViewModelProvider.Factoryを用いていますが、現在では、その必要はありません。

June 29, 2022
androidx.lifecycle:lifecycle-*:2.5.0 is released.

lifecycle-viewmodel-compose now offers a viewModel() API that takes a lambda factory for creating a ViewModel instance without requiring the creation of a custom ViewModelProvider.Factory.

// Within a @Composable, you can now skip writing a custom Factory
// and instead write a lambda to do the initialization of your ViewModel
val detailViewModel = viewModel {
  // This lambda is only called the first time the ViewModel is created
  // and all CreationExtras are available inside the lambda
  val savedStateHandle = createSavedStateHandle()
  DetailViewModel(savedStateHandle)
}

よって、MainViewModelを生成・取得するには、次のコードで実現できます。

val viewModel = viewModel {
    MainViewModel(MyApp.appModule.authRepository)
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?