簡體   English   中英

Android版Mono上mvvmcross中的意圖

[英]Intents in mvvmcross on Mono for Android

我最近已升級到Windows上運行的Xamarin Studio。 我有一個mvvmcross TipCalculator教程的簡單實現,可以很好地在Android和各種Windows版本上運行。 升級后,Android應用程序開始在Main活動(以下)中引發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。 在每一個中,我都用對Activator.CreateInstance()的調用代替了它。

我不確定原始實現背后的原理是什么,我有點擔心我已經破壞了某些東西。 誰能闡明為什么此方法在某些情況下會返回null以及我是否破壞了mvvmcross中的一些基本知識?

我不知道您當前的問題與新的Xamarin工具有什么關系。 您對NullReferenceExceptions的描述,更改的文件和博客文章讓我迷失了...

我猜想您的開發設置甚至應用程序中可能已經發生了很多變化。 如果您可以一次解決一個步驟,那么您將可以算出關鍵的變化是什么。

聽起來好像您的代碼更改可能會解決可能會解決您當前的問題-但這絕對是問題(無論發生了什么)發生后才應用的補丁程序,因此我現在不想在核心代碼中執行此操作。


就您所要求的代碼而言:

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

只有在沒有某種意圖的情況下創建了Activity的情況下,才會出現第一個空值-我想這沒有發生? (除非可能在您當前的工具設置中的某處被設置為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應該在Extras中插入了一些特殊的ViewModel信息-因此,Extras不應該為null ...如果發生這種情況,那么什么代碼在創建活動?


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

return CreateViewModelFromIntent(intent);

這是已導航到的活動的正常啟動路徑。


如果有幫助,這是最新的v3代碼-添加了一些跟蹤信息(但同時也增加了saveState的混亂-現在請忽略!):

    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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM