오늘도 더 나은 코드를 작성하였습니까?

ViewModel - Activity/Fragment 연결하기. 본문

Android Jetpack Architecture/ViewModel

ViewModel - Activity/Fragment 연결하기.

hik14 2021. 2. 19. 12:25

1. Activity, Fragment 각자 뷰모델을 생성하는 경우

 

Activity

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityMainBinding
    private lateinit var mViewModel: NotesViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        mViewModel = ViewModelProvider(this).get(NotesViewModel::class.java)
        
        mBinding.viewModel = mViewModel
    }
}

 

 mViewModel = ViewModelProvider(this).get(NotesViewModel::class.java)

- context와 viewModel 클래스를 매개변수로 생성하여 참조한다.

 

Fragment

 

동일하게 ViewModelProvider(context).get(viewModel::class.java)를 사용하면되지만,

제공해주는 context가 requireActivity()를 통한 부모 activity의 context를 넣어줘야 동일한 viewModel을 제공받을 수 있다.

 

* viewModel ktx로 연결하기

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityMainBinding
	private val mViewModel: NotesViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        mBinding.viewModel = mViewModel
    }
}

 

**Android KTX

Android Jetpack과 기타 Android 라이브러리에 포함된 Kotlin 확장 프로그램 세트입니다.

KTX 확장 프로그램은 간결하고 직관적인 Kotlin을 Jetpack, Android 플랫폼, 기타 API에 제공합니다. 

 

2. ViewModel 공유하기.

 

Android KTX(viewModel KTX) 사용시 by activityViewModels() 이용한 지연 초기화로

Activity에 참조한 ViewModel과 같은 참조를 받을 수 있고, ViewModelProvider를 통한 생성성은 context에 따라 설정 할 수 있다.

 

 

3. childFragment에서 동일한 viewModel 참조하기

 

hik-coding.tistory.com/73