1

最近、Windowsで実行されているXamarinStudioにアップグレードしました。私は、AndroidとさまざまなWindowsフレーバーでうまく動作するmvvmcrossTipCalculatorチュートリアルの簡単な実装を持っています。アップグレードした後、Androidアプリケーションはメインアクティビティ(以下)でNullReferenceExceptionsをスローし始めました。

[Activity(Label = "TipCalculator.Android", MainLauncher = true, Icon = "@drawable/icon")]
public class TipCalculatorActivity : MvxBindingActivityView<TipCalculatorViewModel>

{
    protected override void OnViewModelSet()
    {
        SetContentView(Resource.Layout.TipView);//Throws NullReferenceException
    }

}

mvvmcrossコードを掘り下げた後、MvxAndroidViewsContainerクラスでこのメソッドを見つけました。

public virtual IMvxViewModel Load(Intent intent, Type viewModelTypeHint)
{
    if (intent == null)
    {
        // TODO - some trace here would be nice...
        return Activator.CreateInstance(viewModelTypeHint) as IMvxViewModel;
        //return null;
    }

    if (intent.Action == Intent.ActionMain)
    {
        // TODO - some trace here would be nice...
        return Activator.CreateInstance(viewModelTypeHint) as IMvxViewModel;
    }

    if (intent.Extras == null)
    {
        // TODO - some trace here would be nice...
        return Activator.CreateInstance(viewModelTypeHint) as IMvxViewModel;
        //return null;
    }

    IMvxViewModel mvxViewModel;
    if (TryGetEmbeddedViewModel(intent, out mvxViewModel))
        return mvxViewModel;

    return CreateViewModelFromIntent(intent);
}

元のコードでは、nullを返す2つのケースがあります。これらのそれぞれで、Activator.CreateInstance()の呼び出しに置き換えました。

元の実装の背後にある理論的根拠が何であるかはわかりません。何かを壊したのではないかと少し心配しています。このメソッドがnullを返す場合がある理由と、mvvmcrossの基本的な何かを壊したかどうかについて、誰かが光を当てることができますか?

4

1 に答える 1

1

あなたの現在の問題が新しいXamarinツールと何の関係があるのか​​わかりません。NullReferenceExceptions、変更されたファイル、ブログ投稿についてのあなたの説明は私を失いました...

開発のセットアップやアプリでも、かなりの数の変更があったと思います。一度に1つのステップを元に戻すことができれば、キーの変更が何であるかを理解できるでしょう。

コードを変更すると現在の問題が修正される可能性があるように聞こえますが、問題が発生した後に適用されるパッチであることは間違いないので、今はコアコードでやりたいことではありません。


あなたが尋ねたコードに関して:

        if (intent == null)
        {
            // TODO - some trace here would be nice...
            return null;
        }

この最初のnullは、アクティビティがインテントなしで何らかの形で作成された場合にのみ発生します-これは発生していないと思いますか?(現在のツール設定のどこかで、これがどういうわけかnullとして設定されている場合を除きますか?)


        if (intent.Action == Intent.ActionMain)
        {
            // TODO - some trace here would be nice...
            return Activator.CreateInstance(viewModelTypeHint) as IMvxViewModel;
        }

これは、直接起動されたアクティビティの通常のパスです。このアクティビティには、ViewModelを構築するための追加のパラメーターはありません。

通常、このパスは多くのMvvmCrossアプリでは発生しません。ほとんどのアプリは、スプラッシュスクリーンアクティビティを介して起動します。


        if (intent.Extras == null)
        {
            // TODO - some trace here would be nice...
            return null;
        }

その他のアクティビティの場合、Mvxは特別なViewModel情報をExtrasに挿入する必要があります。したがって、Extrasをnullにする方法はありません...これが発生している場合、どのコードがアクティビティを作成していますか?


IMvxViewModel mvxViewModel;
if (TryGetEmbeddedViewModel(intent, out mvxViewModel))
    return mvxViewModel;

return CreateViewModelFromIntent(intent);

これは、ナビゲートされたアクティビティの通常の起動パスです。


それが役立つ場合は、ここに最新のv3コードがあります-いくつかのトレースが追加されています(ただし、savedStateの混乱も追加されています-今のところこれを無視してください!):

    public virtual IMvxViewModel Load(Intent intent, IMvxSavedState savedState, Type viewModelTypeHint)
    {
        if (intent == null)
        {
            MvxTrace.Trace(MvxTraceLevel.Error, "Null Intent seen when creating ViewModel");
            return null;
        }

        if (intent.Action == Intent.ActionMain)
        {
            MvxTrace.Trace("Creating ViewModel for ActionMain");
            return Activator.CreateInstance(viewModelTypeHint) as IMvxViewModel;
        }

        if (intent.Extras == null)
        {
            MvxTrace.Trace(MvxTraceLevel.Error, "Null Extras seen on Intent when creating ViewModel - this should not happen - have you tried to navigate to an MvvmCross View directly?");
            return null;
        }

        IMvxViewModel mvxViewModel;
        if (TryGetEmbeddedViewModel(intent, out mvxViewModel))
        {
            MvxTrace.Trace("Embedded ViewModel used");
            return mvxViewModel;
        }

        MvxTrace.Trace("Loading new ViewModel from Intent with Extras");
        return CreateViewModelFromIntent(intent, savedState);
    }
于 2013-03-06T15:56:15.597 に答える