조각이 있습니다.
class MyFragment : BaseFragment() {
// my StudentsViewModel instance
lateinit var viewModel: StudentsViewModel
override fun onCreateView(...){
...
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this).get(StudentsViewModel::class.java)
updateStudentList()
}
fun updateStudentList() {
// Compiler error on 'this': Use viewLifecycleOwner as the LifecycleOwner
viewModel.students.observe(this, Observer {
//TODO: populate recycler view
})
}
}
내 조각에는에서 시작되는 StudentsViewModel 인스턴스가 onViewCreated(...)
있습니다.
에서 StudentsViewModel
, students
A는 LiveData
:
class StudentsViewModel : ViewModel() {
val students = liveData(Dispatchers.IO) {
...
}
}
돌아 가기 MyFragment
, 함수 에서 전달 된 매개 변수를 updateStudentList()
불평하는 컴파일러 오류가 발생 합니다.this
.observe(this, Observer{...})
Use viewLifecycleOwner as the LifecycleOwner
이 오류가 발생하는 이유는 무엇입니까? 그것을 제거하는 방법?
답변
이 오류가 발생하는 이유는 무엇입니까?
Lint는 viewLifecycleOwner
프래그먼트 자체의 라이프 사이클 ( ) 대신 프래그먼트보기 의 라이프 사이클 ( ) 을 사용하도록 권장합니다 this
. Google의 Ian Lake와 Jeremy Woods는 이 Android Developer Summit 프레젠테이션의 일부로 차이점을 살펴 보고 Ibrahim Yilmaz는 이 중간 게시물 의 차이점을 간단히 설명합니다.
-
viewLifecycleOwner
프래그먼트가 UI (onCreateView()
,onDestroyView()
)를 가지고 있고 잃어 버렸을 때 -
this
조각의 전체 수명주기 (onCreate()
,onDestroy()
)에 연결되어 있으며
그것을 제거하는 방법?
바꾸다:
viewModel.students.observe(this, Observer {
//TODO: populate recycler view
})
와:
viewModel.students.observe(viewLifecycleOwner, Observer {
//TODO: populate recycler view
})
현재 코드에서 onDestroyView()
가 호출되었지만 호출 onDestroy()
되지 않은 경우을 계속 관찰하여 LiveData
존재하지 않는을 채울 때 충돌이 발생합니다 RecyclerView
. 을 사용 viewLifecycleOwner
하면 그러한 위험을 피할 수 있습니다.
답변
관찰 this
하는 viewLifecycleOwner
데 사용 하는 대신LiveData
viewModel.students.observe(viewLifecycleOwner, Observer {
//TODO: populate recycler view
})