nuits.jp blog

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

Prism for Xamarin.Forms 6.3.0-pre1の紹介

本エントリーは[初心者さん・学生さん大歓迎!] Xamarin その2 Advent Calendar 2016 - Qiitaの15日目のエントリーです。
昨日はkamuさんの

kamusoft.hatenablog.jp

でした! 今回は、新しく公開されたPrism for Xamarin.Forms 6.3.0-pre1について紹介します。
このバージョンにはいくつか破壊的変更が含まれているため、取り扱いには注意してください。

なお、Prismは現在セマンティック バージョニングに対応していませんが、7.0からは対応する予定だそうです。
ここの最後で言及されています。

ちなみに製作者本人が公開されているこちらの記事の要約になります。
画像はこちらから引用させていただいています。
Prism for Xamarin.Forms 6.3 Preview with Improved Template Pack - Brian Lagunas' XAML Blog

ではいってみましょう。

DelegateCommand.FromAsyncHandler is Obsolete

これまでCommandの実行時に非同期処理を実施するため、DelegateCommand.FromAsyncHandlerという非同期対応のDelegateCommandを生成するメソッドが用意されていましたが、これが非推奨となりました。 細かい理由は色々ありますが、端的に言うと例外を隠ぺいしてしまう事があるからだそうです。
近いうちに解決策を提示すると書かれていますね。
まぁCommandはReactiveProperty使うのが個人的にはおすすめです。

OnNavigatingTo added to INavigationAware – Breaking

INavigationAwareにOnNavigatingToメソッドが追加されました。 これまでPrismではA画面からB画面へ遷移する場合

  1. A画面のOnNavigatedFrom
  2. B画面のOnNavigatedTo

と呼び出されていましたが、B画面のOnNavigatedToはB画面が表示されてから実行されていました。
この為

  1. A画面のOnNavigatedFrom
  2. B画面のOnNavigatingTo
  3. B画面のOnNavigatedTo

が追加され、画面表示前の処理を実施できるようになっています。

IConfirmNavigation/IConfirmNavigationAsync changes – Breaking

IConfirmNavigation/IConfirmNavigationAsyncの両者はINavigationAware をこれまで実装していましたが、これが無くなりました。
IConfirmNavigation/IConfirmNavigationAsyncでこれまでOnNavigatedFrom/OnNavigatedToを利用していた箇所は、明示的にINavigationAware の宣言を追加してください。
これ、コンパイルで捕捉されないため、気が付かないと危険です。
要注意を。

Hardware/software back button support

来ました!待望の対応です。
これまで、AndroidやWin10mの物理ボタンや、NavigationPageのタイトルバーから前画面に戻った時にOnNavigatedToが呼び出されない問題がありました。

Prism for Xamarin.Forms入門 NavigationService 0x.戻るボタン問題:INavigationAware - nuits.jp blog

これは、Xamarin.Forms側で予定されていた機能の実装を待っていた形だったのですが、Brian氏待ちきれなくて自力で対応することになったようです。
この為だけにでも6.3早くほしい!

IDestructible

これはViewModelに実装するインターフェースで、ViewModelのインスタンスが解放される際に呼び出されます。

Prismでは(というかXamarin.Formsでは)、NavigationPageで画面遷移する場合、先に進んだ場合、ViewModelのインスタンスは保存された状態となります。
ViewModelを保持している画面から前へ戻る際にViewModelのインスタンスを破棄するわけですが、ViewModel内に明示的に開放しないとリークするリソースが存在した場合が、これまで実装が面倒でした。
具体的にはReactivePropertyのサブスクライブの解除などを実装する個所として、IDestructibleは最適です。

TabbedPage IActiveAware

これまで、タブが選択されたタイミングで選択されたタブ内で処理をするのは一工夫必要でした。
しかも一筋縄ではいかない、謎挙動と格闘する必要がありました。

これからはIActiveAwareを実装することでイベントをハンドルすることができます。 これは助かりますね!

IDeviceService

これ!ボクがIssue立てて対応してもらったやつです!いや、本当は自分でPRまで送るつもりだったんですけどね。。。
Brianが良い奴すぎてPR送るチャンスを逃しました。
その経緯はこちらをご覧ください。

Xamarin.FormsのDeviceクラスをInterfaceでラップしてインジェクションできるようにしたものです。
テスト性の向上につながります。
まれに便利です!

Prism Template Pack

Prism Template Packが色々感動的な感じになっていますね。
主に二つでしょうか。

Project作成時がおしゃれで便利に!

f:id:nuitsjp:20161215085519p:plain

こんな感じで、作成対象が選べますし、PCLのプロファイルも適切に設定されます。
すばらしい!

Page作成時の振る舞いがかしこい!

PrismのPage作成テンプレートから画面を作成すると。。。

f:id:nuitsjp:20161215085710p:plain

ViewとViewModelが同時に作成されます。もちろんAutoWireも設定されるので、ミスが減ります。

f:id:nuitsjp:20161215085748p:plain

またコンテナ登録も自動で行われます。

f:id:nuitsjp:20161215085814p:plain

便利ですね!

最後に

まだまだいくつか便利機能が追加されるようです。
リリースは来年初頭が予定されているそうです。
非常に楽しみですね!

それではまた!