LifecycleOwner के रूप में viewLifecycleOwner का उपयोग करें


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, studentsएक है LiveData:

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

वापस करने के लिए MyFragment, फ़ंक्शन में updateStudentList()मुझे कंपाइलर त्रुटि मिलती है जो thisमैं उस पैरामीटर से शिकायत करता हूं जो मैंने .observe(this, Observer{...})उसमें पारित किया हैUse viewLifecycleOwner as the LifecycleOwner

मुझे यह त्रुटि क्यों मिली? मैं इससे छुटकारा कैसे पाऊं?

जवाबों:


31

मुझे यह त्रुटि क्यों मिली?

लिंट अनुशंसा कर रहा है कि आप viewLifecycleOwnerअपने स्वयं के टुकड़े के जीवनचक्र के बजाय टुकड़े के विचारों के जीवनचक्र ( this) का उपयोग करें। Google की इयान झील और जेरेमी वुड्स इस Android डेवलपर शिखर सम्मेलन की प्रस्तुति के हिस्से के रूप में अंतर पर जाते हैं , और इब्राहिम यिलमाज़ इस मध्यम पद के मतभेदों को संक्षेप में शामिल करते हैं:

  • 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 के लिए एक दृश्य नहीं लौटाता। अन्यथा आपको एक अपवाद मिलेगा:IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
Android डेवलपर

@androiddeveloper आप अभी भी onViewCreated और उसके बाद जीवन चक्र का उपयोग कर सकते हैं?
jontro

@jontro बहुत यकीन है कि आप कर सकते हैं। इसे आज़माएं और मुझे बताएं :)
Android डेवलपर

@androiddeveloper ठीक काम करने लगता है!
मोंट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.