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

私のフラグメントでは、で開始されるStudentViewModelのインスタンスがありますonViewCreated(...)

StudentsViewModelstudentsLiveData

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

に戻ってMyFragment、関数では、それに渡しupdateStudentList()thisパラメータを不平を言うコンパイラエラーが発生します.observe(this, Observer{...})Use viewLifecycleOwner as the LifecycleOwner

このエラーが発生するのはなぜですか?それを取り除く方法は?

回答:


33

このエラーが発生するのはなぜですか?

Lintは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
。:あなたはまだ「この」onCreateViewのビューを返さないDialogFragment(そしておそらくすべてのフラグメントの場合に使用する必要があることをそうしないと、例外を取得します。注IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
Androidデベロッパーを

@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.