読者です 読者をやめる 読者になる 読者になる

nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

【メモ】INavigationがPlatformによって実装が異なる話

あくまでメモでなのでご注意を

  • 網羅的な説明になっていません
  • 内容の正誤を十分検証していません

つぎのようなコードを呼ぶとき

page.Navigation.PushAsync(new NewPage());

NavigationプロパティはINavigationインターフェースの実装クラスで、その実態はNavigationProxyクラスです。
NavigationProxyはあくまでProxyクラスで、実体?はInnerプロパティに設定されています。

Xamarin.Forms/NavigationProxy.cs at b9b9d2536ff0cd6ae4526356d663706c721e481f · xamarin/Xamarin.Forms · GitHub

画面遷移するたびにProxyは作られて、Innnerは遷移前から遷移後へ受け渡されていきます。

実体は大きく二つあって、Modal遷移の場合はApplicationクラスの内部クラスのNavigationImplクラスが

Xamarin.Forms/Application.cs at e6d5186c8acbf37b877c7ca3c77a378352a3743d · xamarin/Xamarin.Forms · GitHub

Hierarchical遷移(つまりNavigationPage)の場合はNavigationPageの内部クラスのNavigationImplクラスが使われます。

Xamarin.Forms/NavigationPage.cs at 070f1dcdb50b47c7abdebf91010626d55881a8fc · xamarin/Xamarin.Forms · GitHub

でまぁ、これで終わりじゃないのがめんどうくさくって、ApplicationクラスのMainPageプロパティの設定時にNavigationImpleのさらにInnnerへ各プラットフォーム別の実装が設定されます。
Androidの場合はここ

Xamarin.Forms/Platform.cs at e6d5186c8acbf37b877c7ca3c77a378352a3743d · xamarin/Xamarin.Forms · GitHub

各PlatformクラスがINavigationを実装しているんですね。

つまりINavigationの振る舞いは、当然と言えばそれまでですがプラットフォームによって異なります。
動作もちょっと違います。
私が知っている範囲だと、Modal遷移した時のNavigationStackの要素数が0だったり1だったりプラットフォームによって違う気がしています。

この辺りちゃんと調べて、必要であれば貢献したいですね。
以上です。