LifecycleOwner olarak viewLifecycleOwner öğesini kullanın


17

Bir parçam var:

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
        })
    }
}

Benim parçamda, başlatılan StudentsViewModel bir örneğim var onViewCreated(...).

Olarak StudentsViewModel, studentsbir olduğunu LiveData:

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

Geri MyFragment, işlevi updateStudentList()şikayetçi derleyici hata alıyorum thisben geçirilen parametre .observe(this, Observer{...})olduğunuUse viewLifecycleOwner as the LifecycleOwner

Neden bu hatayı alıyorum? Nasıl kurtulur?

Yanıtlar:


32

Neden bu hatayı alıyorum?

Lint, parçanın yaşam döngüsünün ( viewLifecycleOwner) yerine parçanın görünümlerinin ( ) yaşam döngüsünü kullanmanızı önerir this. Google'dan Ian Lake ve Jeremy Woods bu Android Geliştirici Zirvesi sunumunun bir parçası olarak farkı ele alıyorlar ve İbrahim Yılmaz bu Orta mesajdaki farklılıkları kısaca anlatıyor:

  • viewLifecycleOwnerparçanın UI'sı ( onCreateView(), onDestroyView()) olduğunda (ve )

  • thisparçacığın , esasen daha uzun olabilen genel yaşam döngüsüne ( onCreate(), onDestroy()) bağlıdır

Nasıl kurtulur?

Değiştir:

viewModel.students.observe(this, Observer {
        //TODO: populate recycler view
    })

ile:

viewModel.students.observe(viewLifecycleOwner, Observer {
        //TODO: populate recycler view
    })

Mevcut kodunuzda, onDestroyView()çağrılır, ancak çağrılmazsa, var olmayan bir kişiyi doldurmaya çalıştığınızda, belki de çökmesini onDestroy()gözlemlemeye devam LiveDataedersiniz RecyclerView. Kullanarak viewLifecycleOwnerbu riski önlersiniz.


6
DialogFragment (ve muhtemelen onCreateView için bir görünüm döndürmeyen her parça) durumunda yine de "this" kullanmanız gerektiğini unutmayın. Aksi takdirde bir istisna alırsınız:IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
android geliştirici

@androiddeveloper lifeCycleOwner'ı onViewCreated ve sonrasında yine de kullanabilirsiniz?
jontro

@jontro Emin olabilirsin. Deneyin ve bana bildirin :)
android geliştirici

@androiddeveloper iyi çalışıyor gibi görünüyor!
jontro

1

Gözlemlemek için thiskullanım yerineviewLifecycleOwnerLiveData

viewModel.students.observe(viewLifecycleOwner, Observer {
    //TODO: populate recycler view
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.