লাইফাইসাইকেলওউনার হিসাবে ভিউলিফাইসাইকেলওয়ানার ব্যবহার করুন


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

আমার খণ্ডে আমার কাছে স্টুডেন্টভিউমোডেলের একটি উদাহরণ রয়েছে যা শুরু হয়েছিল 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। ইয়ান লেক এবং গুগলের জেরেমি উডস এই অ্যান্ড্রয়েড বিকাশকারী সামিট উপস্থাপনার অংশ হিসাবে পার্থক্যটি অতিক্রম করেছে এবং ইব্রাহিম ইলমাজ এই সংক্ষেপে এই মিডিয়াম পোস্টের পার্থক্যগুলি সংক্ষেপে লিখেছেন:

  • 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
নোট করুন যে ডায়ালগফ্রেগমেন্টের ক্ষেত্রে আপনার এখনও "এটি" ব্যবহার করা উচিত (এবং সম্ভবত এমন প্রতিটি খণ্ড যা অনক্রিটভিউয়ের জন্য কোনও ভিউ ফেরায় না। অন্যথায় আপনি একটি ব্যতিক্রম পাবেন:IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আপনি এখনও ভিউক্রিটেড এবং তারপরে লাইফ সাইকেলঅউনার ব্যবহার করতে পারেন?
jontro

@ জোন্ট্রো নিশ্চিত যে আপনি এটি করতে পারেন। এটি ব্যবহার করে দেখুন এবং আমাকে জানান :)
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার মনে হচ্ছে ঠিক আছে!
jontro

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.