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

nuits.jp blog

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

Prism for Xamarin.Forms 6.3.0アップデートの注意事項

Android Prism iOS iPhone Xamarin

ちょっとTLで話題になっていたのでせっかくだから文章でまとめようかと思いエントリーにしてみました。

  • 6.3.0の正式版リリース時にも注意が必要な事項
  • 6.3.0-pre独自の注意事項(リリースまでにはおそらく改修されるだろう内容)

についてまとめてみましたので、よろしかったらご覧ください。
なお現在の6.3.0-pre1でリリースされている機能については以下をご覧ください。

www.nuits.jp

はじめに

本エントリーは2017/01/30時点の

  • 既にプレリリースされている6.3.0-preの情報
  • 現在のPrismのIssuesやPull Requestの状況

に基づいて記載しています。
現時点の状況を「私が把握している範囲で」できるだけ正確に記載したいと思っていますが、思い違っていたりそもそも時間経過とともに不適切な内容となる可能性がありますので注意してください。

6.3.0の正式版リリース時にも注意が必要な事項

INavigationAwareの破壊的変更について

INavigationAwareには新しくOnNavigatingToというメソッドが追加されます。
この為、既存のコードは軒並みOnNavigatingToが実装されていないという事でコンパイルエラーになります。
とりあえず空実装でよいので、コードを追加しましょう。

ちなみにPrism7.0からはセマンティックバージョニングに対応して、破壊的変更についてはトレースしやすくしていく方針のようです。

IConfirmNavigation/IConfirmNavigationAsyncの破壊的変更について

これまでINavigationAware を実装していましたが、削除されています。
この為、IConfirmNavigation/IConfirmNavigationAsyncだけを実装して

  • OnNavigatedFrom
  • OnNavigatedTo

を利用していたコードが呼び出されなくなります。
コンパイルは通ってしまうので注意が必要です。。。(なぜ変更したのかは把握していません)
ViewModelにINavigationAwareの宣言を追加しましょう。

「戻るボタン」問題について

Prism6.2.0でも「戻るボタン」を押下された際に

  • OnNavigatedFrom
  • OnNavigatedTo

が呼び出されないという課題がありました。
これは6.3.0で解消されています。
Xamarin.Forms側の特定の機能の実装を待っていたのですが、待てないので先に対応する事になったようです。

しかし、6.3.0-pre1でも「戻るボタン」から戻った場合に、以下が呼び出されない課題が残っています。
そしておそらく正式版でも非対応のままリリースされる可能性が高いです。

  • IConfirmNavigation#CanNavigate
  • IConfirmNavigationAsync#CanNavigateAsync
  • INavigationAware#OnNavigatingTo

そして面倒なことに、INavigationServiceのGoBackメソッド呼び出し時には実行されます。
現時点でこれらに対応するためにはNativeの領域に踏み込む必要があり、例えばAndroidであればActivityを独自に実装する必要があります。
NavigationPageのOnBackButtonPressedをオーバーライドすれば良いのではという意見もあるかもしれませんが以下に対応できません。

  • Windows 10 Mobileの物理戻るボタン
  • NavigationPageのNavigationBarからの戻るボタン

これは主に、Xamarin.Forms.NavigationPageに「Poppedイベントは定義されているが、Popping(Popされる前の)イベントが定義されていない」事に由来します。
そしてそのイベントに対する追加要望は既に提出されていますが(いるはずですが。。。)、まだ対応されていません。

Prismから見た場合、専用のActivityを強要すること(やiOSの場合もっとプラットフォーム固有な部分への踏み込み)などは適切な対応とはとても言えませんので、Xamarin.Forms側の対応を待って動くことになると思います。

という事で、当面は前述の3つのイベントは利用しないか、自前で対応する事が好ましいでしょう。
具体的にどうすれば対応できるかは。。。その内エントリーにできたらいいなあ。

6.3.0-pre独自の注意事項

絶対パスナビゲーションの実行時にIDestructibleが機能しない

現在、IDestructibleは1ページずつ戻る場合にのみ対応しており、Rootまで一気に戻った場合に呼び出されない問題があります。
こちらは既にIssueが上がっていますし、6.3リリースまでには対応されるでしょう。(多分ねw

TabbedPageに対する機能拡張の内容が未確定

これはまだpre1にも含まれていない機能です。
というか、PRがまだマージされてさえいない段階なので、自前でビルドしないと使えませんw

Prism6.3.0ではタブ間の遷移時にイベントをハンドルできるIMultiPageNavigationAwareというものが追加されます。
名前から分かる通り、MasterDetailにも適用可能です。
選択時のイベントが現在

  • OnInternalNavigatedFrom
  • OnInternalNavigatedTo

となっていますが、名前が変わる可能性があります。
また、タブの中身がNavigationPageだった場合に、イベントが伝播されるのが、NavigationPage本体であってNavigationPage内に表示されているPageではありません。
これはちょっと使い勝手が悪いので、NavigationPageの場合は、子にも上記イベントを伝播するようにすべきではないか?という提案が誰かさんによってなされており、前向きに検討されています。

[XF] Navigating between Tabs · Issue #650 · PrismLibrary/Prism · GitHub

この辺りの振る舞いは今後少し変わる可能性があります。

最後に

大きなところはこんなところでしょうか?
という訳で、本エントリーはここでいったん閉めます。
何か思い出したら追記するかもしれません。
それではまた!