LoginSignup
0
0

navigation component の lifecycle

Last updated at Posted at 2022-12-07

navigation component の lifecycle

navigation componentを使っていて、挙動であれっ?と思うことがあったため、簡単な画面遷移アプリを作ってlifecycleを試してみました。

内容としては、ボタンを押すとMainFragmentSubFragmentにnavigationされるというものです。
以下、その時のログ(testは、MainFragment, test2はSubFragmentに対応)

D/onAttach: test
D/onCreate: test
D/onCreateView: test
D/onViewCreated: test
D/onStart: test
D/onResume: test
//ボタンを押す
D/onPause: test
D/onStop: test
D/onAttach: test2
D/onCreate: test2
D/onCreateView: test2
D/onStart: test2
D/onResume: test2
D/onDestroyView: test
//戻る
D/onPause: test2
D/onStop: test2
D/onCreateView: test
D/onViewCreated: test
D/onStart: test
D/onResume: test
D/onDestroyView: test2
D/onDetach: test2

注意点としては、MainFragmentonDestroyViewが呼ばれるのがSubFragmentonResumeの後という点ですね。
あと画面戻るを押したときはSubFragmentonDestroyViewが呼ばれるのがMainFragmentonResumeの後になります。

私は、MainFragmentSubFragmentonViewCreated中に同じFlowを処理する記述をしていたのですが、なぜか裏で動いている挙動に困っていたのですが、

MainFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        lifecycleScope.launch {
            something.collect {
                // TODO
            }
        }
SubFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        lifecycleScope.launch {
            something.collect {
                // TODO
            }
        }

↑画面遷移時にTODOが両方のFragmentで発火する

MainFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        lifecycleScope.launch {
            lifecycle.whenStarted{
                something.collect {
                    // TODO
                }
            }
        }
SubFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        lifecycleScope.launch {
            lifecycle.whenStarted{
                something.collect {
                    // TODO
                }
            }
        }

lifecycle.when〇〇等を使って、ちゃんと発火の制限をしましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0