20181120_Xamarin_lifecycle

Xamarin Native MVVMCross ビューモデルのライフサイクル

Xamarin Nativeでの挙動についてメモ

最近こちらの本でXamarinネイティブについて学んでます。

青柳臣一(2017) Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎

既にいくつかメソッド名が変わっていたりしたので、2018年11月現在メモします。 また、書籍には載っていなかったメソッドがいくつか入力補完で出てきたのでそちらについてもどこで呼び出されているのかまとめました。

対象:Prepare() , ViewCreated(), ViewDestroy()

環境

  • Xamarin Native
  • MvvmCross.StarterPack v5.7.0
    • MvvmCross
    • MvvmCross.Binding
    • MvvmCross.Core
    • MvvmCross.Platform

ライフサイクル

実際に実行して確かめてみたところこの順序で呼ばれるようです

  1. コンストラクター
  2. Start()
  3. Prepare()
  4. Initialize()
  5. ViewCreated()
  6. ViewAppearing()
  7. ViewAppeard()
  8. ViewDisappearing()
  9. ViewDisappeard()
  10. ViewDestroy()

Document

公式ドキュメント

公式ドキュメントを見ると、標準的なviewmodelのライフサイクルとしては、上記のうち3つだけが書かれています。

  • コンストラクター

Construction: Called when the object is instantiated. You can use Dependency Injection here to introduce all dependencies!

  • Prepare()

Prepare: The initial point for your ViewModel. You can use this method to receive and store all parameters (it is your responsibility to handle them).

  • Initialize()

Initialize: All heavy work should be run here. This method returns a Task, which means you can mark it as async and use await safely. If this method fails, the Navigate call that you are probably awaiting will fail, so you might want to catch that exception.

また、下記がビューのライフサイクルがビューモデルのライフサイクルとして来ているようです。 上記リンク先にはAppearing()がAndroidでいうOnAttachedToWindow、iOSでいうViewWillAppear()など対応もかかれています。 が、そもそもAndroidやiOSの開発経験もないのであまり僕には関係なさそうなので省略します()

ViewCreated();
ViewAppearing();
ViewAppeared();
ViewDisappearing();
ViewDisappeared();
ViewDestroy();

基本は、コンストラクター等と、ビューのライフサイクルを持ってきたものを利用すれば大体は問題ないのかな? イマイチ、StartとPrepareの違いなどがよくわからないですね。 これはこういうときに使えばいいよってのを知りたい。 誰か詳しい人教えてください(他力本願

Code

        /// <summary>
        /// コンストラクター
        /// :クラス生成時
        /// </summary>
        public MainViewModel()
        {
            System.Diagnostics.Debug.WriteLine("Constructor");
        }

        /// <summary>
        /// 画面の初期化開始時
        /// </summary>
        public override void Start()
        {
            System.Diagnostics.Debug.WriteLine("Start");
            base.Start();
        }

        /// <summary>
        /// 画面の初期化開始時(パラメータ無しの場合)(≒Initialize?)
        /// </summary>
        public override void Prepare()
        {
            System.Diagnostics.Debug.WriteLine("Prepare");
            base.Prepare();
        }

        /// <summary>
        /// 画面の初期化時(パラメータ無しの場合)
        /// </summary>
        /// <returns></returns>
        public override Task Initialize()
        {
            System.Diagnostics.Debug.WriteLine("Initialize");
            return base.Initialize();
        }

        /// <summary>
        /// 画面の生成時
        /// </summary>
        public override void ViewCreated()
        {
            System.Diagnostics.Debug.WriteLine("ViewCreated");
            base.ViewCreated();
        }

        /// <summary>
        /// 画面の表示処理開始時
        /// </summary>
        public override void ViewAppearing()
        {
            System.Diagnostics.Debug.WriteLine("ViewAppearing");
            base.ViewAppearing();
        }

        /// <summary>
        /// 画面が表示された時
        /// </summary>
        public override void ViewAppeared()
        {
            System.Diagnostics.Debug.WriteLine("ViewAppeard");
            base.ViewAppeared();
        }

        /// <summary>
        /// 画面のクローズ処理開始時
        /// </summary>
        public override void ViewDisappearing()
        {
            System.Diagnostics.Debug.WriteLine("ViewDisappering");
            base.ViewDisappearing();
        }

        /// <summary>
        /// 画面がクローズされた時
        /// </summary>
        public override void ViewDisappeared()
        {
            System.Diagnostics.Debug.WriteLine("ViewDisappeard");
            base.ViewDisappeared();
        }

        /// <summary>
        /// 画面が破棄された時
        /// </summary>
        /// <param name="viewFinishing"></param>
        public override void ViewDestroy(bool viewFinishing = true)
        {
            System.Diagnostics.Debug.WriteLine("ViewDestroy");
            base.ViewDestroy(viewFinishing);
        }

マルチタスク画面を開いたときなどに呼ばれるもの

Android

マルチタスク画面を呼び出したとき

  • ViewDisappering
  • ViewDisappeard

マルチタスク画面から戻ったとき

  • ViewAppearing
  • ViewAppeard

まとめ

というわけでXamarin,MvvmCrossのビューモデルのライフサイクルについて確認しました。 すべてのうまい用途がわからないので、とりあえずは下記くらいを定義して使っていけばいいのかなと思いました。

メソッド 内容
コンストラクター 生成時
Initialize() 初期化時
ViewAppearing() 画面の表示開始時
ViewAppeard() 画面の表示時
ViewDisappearing() 画面のクローズ処理時
ViewDisapperd() 画面クローズ時

以上!