2回の時だったり3回の時だったりもする。NavigationDesitinationで分岐でviewを指定すると、複数回遷移先が読まれる。どえらい仕様だったわけよ

概要

NavigationDestination の中に、ifとかswitchなどの分岐で、viewを選択させて遷移すると、どういうわけか遷移先が複数回読まれる事象が発生したんです。

結論

initを何度も読まれて困るようなものを作るなよ、くそども

※こんな強い言葉ではないですが、海外のredditにはこう書いてあった

具体的にどういう状態で発生してるのか?

具体的に以下のような書き方です

            .navigationDestination(for: Route.self){ route in
                if route == .nav_1 {
                        nav_1()
                    }else{
                        nav_2()
                        
                    }
              }

nav_1() とnav_2() がviewなんですけど、遷移が発生した際、該当してるviewが複数回読み込まれる状態です。

ややこしいことに、ifの場合は2回、switchの時は3回だったりと、色々ややこしいです。

なんで困ったのか?

同じ困った人のために記載しておくと、遷移先のviewのinitに、データの取得処理が入っていたんですよ。

だから、遷移した際、apiが多重にコールされる、ろくでもないことになったんです

で、対処法は何なのか?

.onAppearを使えってことらしいです。

initに期待はするなってことらしいです。

これで7日ぐらい悩んだ上、teratailのAI回答には嘘つかれるし、他には回答が来ないし、自己解決で記録しておきます。

これで助かる人がいてくれたら嬉しい。日本語で検索してもこの状況は出てこなかったし

コメント