nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

JXUGC #18 Why Prism for Xamarin.Forms フォローエントリー

先日、JXUGのカンファレンスにて表題の発表をさせていただきました。

eventdots.jp

いや〜、疲れましたけど終わったら楽しかったです。
初めてのライブコーディングで、本当に開始前は手が震えていましたけど終わったらいい思い出です。
開始直前に田渕さんに、アンケートのURLを流してくれと頼まれましたが、ガチでそんな余力なくてお断りしたくらい緊張してましたw

さて、当日は時間の都合上、幾つか説明を割愛した箇所がありました。
そこで本エントリーでは、説明を割愛した点を幾つかフォローしておきたいと思います。

ViewModelLocatorについて

ViewModelLocatorはViewのクラス名から自動的にViewModelを紐付けてくれて便利!
というのは、まぁ嘘ではないにしても、大切な観点が抜け漏れています。
Prismは基本的にDependency Injectionベースで動作しています。
ViewModelにはModelがインジェクションされるので、ViewModelをユーザーコードで勝手にnewしてしまったら、インジェクションすることができません。
その為に処理の起点となる、ViewへViewModelを割り当てる箇所も、DIコンテナに実行させる必要があるわけです。
その辺の話は過去のエントリーに纏めているので読んでみてください。

www.nuits.jp

DependencyServiceの課題のアナザーストーリー

DependencyServiceをそのまま利用してはテストできないということで、デモではITextToSpeechServiceをインジェクションしてもらうように修正しました。
そこ自体は問題ないのですが、実はもう一つ解決策があり、本来はそちらの方が推奨されています。
じゃぁなぜあっちをお見せしたかというと、デモの時間制約の都合です。残念。。。

さて、では推奨される方法は?というと、インジェクションしてもらう箇所自体はあれで問題ありません。
問題はそのインジェクションされる実体のコンテナへの登録方法です。
推奨されるのはPlatformInitializerであり、DependencyServiceの登録方法は一貫して利用しない方が好ましいようです。
そのあたりの詳細はこちらに記載していますので、ご覧下さい。

www.nuits.jp

IConfirmNavigationAsyncの未説明だったメソッドの2つについて

CanNavigateAsyncの説明の際に次の2種類のメソッドの説明を割愛しました。

  • OnNavigateFrom
  • OnNavigateTo

これは画面遷移の際に、画面から移動する時と、画面に移動してきた時のイベントをハンドルして処理を入れたり、画面遷移時のパラメーターの受け渡しに利用できます。(戻る時のパラメーター渡しはどうだったかなぁ?)
その辺の使い方はこちらに記載しています。

www.nuits.jp

ただし、実はこの機能、AndroidやWin10Mの物理的な戻るボタンなどで戻られた時に機能しない問題があります。
その辺の説明はこちらに記載しています。
回避策も紹介しています。

www.nuits.jp

さて、この問題、大元はXamarin.Forms側の回収待ちだったようなのですが、最近Prism独自で対応したみたい?
次のバージョンである、6.3で解決されてリリースされてくるかも知れませんね。

github.com

なんか他にもあった気がしないでもないですが、とりあえず一旦ここまでで。
それではまた!