Android

ViewModel 생성법 2가지

Dean83 2023. 1. 26. 11:11

글을 작성하면서 틀릴 가능성이 매우 높다. 추후 수정 가능성 높음. 

한가지 방법은 ktx를 이용한 방법이고, 한가지 방법은 koin 라이브러리를 이용한 방법이다. 

 

ktx를 이용한 방법이 보다 쉽게 생성할 수 있고, koin은 복잡하다. 단 koin의 경우 ViewModel 외에 Repository, Model 등도 관리하기 좋다. koin의 경우 DI 패턴을 이용한다. 

 

 

1. KTX를 이용한 ViewModel 생성
     - 종속성 추가

def archLifecycleVersion = '2.2.0'
implementation "androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion"
kapt "androidx.lifecycle:lifecycle-compiler:$archLifecycleVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$archLifecycleVersion"


그리고, apply plugin: 'kotlin-kapt'

     - ViewModel 클래스 생성. 상속은 AndroidViewModel을 받는다. 

        예 : ) class testViewModel(application : Application) : AndroidViewModel(application) { ...... }

     - Activity 혹은 Fragment 에서 ViewModel 맴버변수로 생성       

val viewModel : testViewModel by viewModels()

 

2. Koin 을 이용한 ViewModel 생성 (사실상 Koin 사용법)
    - 종속성 추가. 위에 추가한 종속성 외에 추가로 추가

    implementation 'io.insert-koin:koin-androidx-ext:2.2.3'
    implementation 'io.insert-koin:koin-androidx-fragment:2.2.3'
    implementation 'io.insert-koin:koin-androidx-viewmodel:2.2.3'
    implementation 'io.insert-koin:koin-androidx-scope:2.2.3'

     - 각종 모듈 class 생성 (여기서는 ViewModelModule). 이외 repository나 model module 도 생성할 수 있다. 
         single 이나 factory를 통해 생성 할 수 있다. 

object ViewModelModule {

    val getModule = module {

        viewModel {

            //뷰모델 생성자에 필요한 인자값 만큼 get()을 넣어준다.
            //여기서는 context 로 예를 든다. 즉 testViewModel 클래스 생성자 인자로
            //Context를 받는다
            testViewModel(get())
        }
    }
}

    - Android Main Activity - Application 에 코드 추가

    override fun onCreate() {
        super.onCreate()

        // koin 초기화.
        startKoin {
            androidLogger(if (BuildConfig.DEBUG) Level.ERROR else Level.NONE)
            androidContext(this@MathpidApplication)
            // 모듈 설정.
            modules(
                ViewModelModule.getModule
            )
        }

/*

    - Activity 에서 ViewModel 생성 (맴버변수로)

val viewModel by viewModel<testViewModel>()