Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- build
- GIT
- 의존성주입
- error
- Android
- Kotlin
- 안스
- ADB
- coroutine
- dart
- 웹뷰
- 에러
- 안드로이드스튜디오
- 안드로이드 스튜디오
- Retrofit
- 코틀린
- studio
- Gradle
- 유튜브
- WebView
- Github
- 안드로이드
- 깃헙
- viewpager
- 스튜디오
- RecyclerView
- 코루틴
- MVVM
- image
- 레트로핏
Archives
- Today
- Total
코딩하는 일용직 노동자
ViewModelProvider.Factory를 이용해 파라메터가 있는 ViewModel 생성하기. 본문
액티비티나 프래그먼트 내에서 ViewModel을 사용하려면 ViewModelProvider를 이용해 ViewModel을 생성해 사용할 수 있습니다.
ViewModel을 생성할때는 파라메터가 있을때와 없을때의 생성방법이 차이가 있습니다.
파라메터가 없는 ViewModel은 아래처럼 생성이 가능합니다.
val viewModel: MainActivityViewModel by lazy {
ViewModelProvider(this)[MainActivityViewModel::class.java]
}
하지만 MainActivityViewModel의 생성자에 파라메터가 있다면 위 방법으로 객체생성이 안됩니다.
테스트를 위해 Int형의 파라메터를 받는 MainActivityViewModel 클래스를 만들어보겠습니다.
import androidx.lifecycle.ViewModel
class MainActivityViewModel(defaultCount: Int): ViewModel() {
private var totalCount = 0
init {
totalCount = defaultCount
}
fun getCount(): Int{
return totalCount
}
fun addCount(count : Int){
totalCount += count
}
}
ViewModel 클래스를 상속하여 정의한 클래스는 개발자가 직접 생성자를 통하여서 객체를 생성할 수 없습니다.
ViewModelProvider.Factory 인터페이스를 구현해서 생성해야합니다.
우선 ViewModelProvider.kt 파일의 Factory 인터페이스 소스를 살펴보겠습니다.
ViewModel객체 T를 리턴하는 create() 를 구현해서 사용하도록 되어 있는것을 알 수 있습니다.
이제 파라메터를 전달받을 MainViewModelFactory를 ViewModelProvider.Factory 인터페이스를 상속받아 생성해봅시다.
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class MainViewModelFactory(val count: Int): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if(modelClass.isAssignableFrom(MainActivityViewModel::class.java)){
return MainActivityViewModel(defaultCount = count) as T
}
throw IllegalArgumentException()
}
}
MainViewModelFactory를 만들었으니 이제 MainActivityViewModel의 객체를 생성해 사용해보겠습니다.
class MainActivity : ComponentActivity() {
private lateinit var viewModelFactory: MainViewModelFactory
private lateinit var viewModel: MainActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
viewModelFactory = MainViewModelFactory(count = 15)
viewModel = ViewModelProvider(this, viewModelFactory).get(MainActivityViewModel::class.java)
viewModel.addCount(20)
viewModel.addCount(2)
viewModel.addCount(9)
Log.d("MainActivity", "total count is ${viewModel.getCount()}")
}
}
}
정상적으로 viewModel 객체가 생성되어 동작하는 것을 확인했습니다.
'안드로이드' 카테고리의 다른 글
MutableStateFlow, MutableSharedFlow, Channel의 차이점 (0) | 2024.03.17 |
---|---|
CoroutineFlow Operator의 종류 (0) | 2024.03.17 |
Compose enableEdgeToEdge를 이용해 전체화면 구현하기. (0) | 2024.03.13 |
LifecycleEventObserver를 이용한 Activity가 아닌 클래스에 라이프사이클을 연결. (0) | 2024.03.05 |
aab, apk 빌드시 파일명 자동 생성하는 방법. (0) | 2024.01.31 |