viewLifecycleOwner를 LifecycleOwner로 사용


17

조각이 있습니다.

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, studentsA는 LiveData:

class StudentsViewModel : ViewModel() {
    val students = liveData(Dispatchers.IO) {
          ...
    }
}

돌아 가기 MyFragment, 함수 에서 전달 된 매개 변수를 updateStudentList()불평하는 컴파일러 오류가 발생 합니다.this.observe(this, Observer{...})Use viewLifecycleOwner as the LifecycleOwner

이 오류가 발생하는 이유는 무엇입니까? 그것을 제거하는 방법?

답변:


32

이 오류가 발생하는 이유는 무엇입니까?

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하면 그러한 위험을 피할 수 있습니다.


6
DialogFragment (및 아마도 onCreateView에 대한 뷰를 반환하지 않는 모든 조각)의 경우에도 여전히 "this"를 사용해야합니다. 그렇지 않으면 예외가 발생합니다.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
android developer

@androiddeveloper onViewCreated 이상에서 lifeCycleOwner를 계속 사용할 수 있습니까?
jontro

@jontro 정말 확실합니다. 그것을 시도하고 알려주십시오 :)
Android 개발자

@androiddeveloper는 잘 작동하는 것 같습니다!
jontro

1

관찰 this하는 viewLifecycleOwner데 사용 하는 대신LiveData

viewModel.students.observe(viewLifecycleOwner, Observer {
    //TODO: populate recycler view
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.