ScrollView+Button をNavigationStackで使った時に発生する場合があったので、忘れないようにメモ、他発生したパターンの記録をしておく。今後また発生した時のための確認用

Update NavigationAuthority bound path tried to update multiple times per frame.ってなんなん?

ナビゲーションパスが一つの描画フレーム内で複数回の更新が発生した時に表示される。

基本的に、SwiftUIのNavigationStackやNavigationLinkなどのナビゲーション機能を使っているときに発生するんだけど、色々調べたところ、状態変数が変更した時に出るとも限らんらしい。

今回も状態変数の変化は見られないのに、このエラーが発生している

今回発生したコード

今回遭遇したのは、以下のようなコード。
NavigationStackとTableも使ってる

        TabView(selection:$TabSelector){

            NavigationStack(path:$routepath){
                ScrollView{
                  Button(action:{print("unko")}){Text("unko")}

                }
            }

これ、routepathは、StateObjectで監視してるものなんだけど、これを@Stateでローカル変数にすると、エラーは発生しない。色々複雑な条件で発生するものっぽい。


で、以下に変更しても問題は発生しない

        TabView(selection:$TabSelector){

            NavigationStack(path:$routepath){
                ScrollView{
                 Text("unko")

                }
            }

Buttonが原因なのでは…と思っているけども…

Buttonを使わず、TextによるカスタムButtonで対応することに

onTapGestureを使って、Buttonを使わないようにしたら、回避できたのでいったんこれで対応することに。

というか、Buttonは二度と使わないで生きていこうかと思った

        TabView(selection:$TabSelector){

            NavigationStack(path:$routeNavigationPath_beta.searchpath){
                ScrollView{
                    
                    Text("unko")
                                .padding()
                                .background(Color.blue)
                                .cornerRadius(5)
                                .onTapGesture {
                                    print("unkoburiburi")
                                }
                }
   }

Textを使ってButtonと同じようなものは作れるのだから、それでなんとか。。。

他、発生して対応したパターンリスト

アニメーションで発生

監視してる値が状態変数だった場合に、数回変異が発生することになり、エラーが出ていた

NavigationStackが重なっていた

オリジナルのmodifierを作成し、中にNavigationStackが入っていたのだが、
そのmodifierを使いつつ、別途NavigationStackを適用していて発生

同じカテゴリの記事

コメント