2013-03-05 5 views
1

Недавно я обновился до Xamarin Studio, работающего под Windows. У меня есть простая реализация учебника TvCalculator mvvmcross, который отлично работает на Android и различных видах Windows. После того, как я модернизирована, Android приложений начали бросать NullReferenceExceptions в основной деятельности (ниже):Намерения в mvvmcross на Mono для Android

[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?

+0

, что был «вопрос» что эти вещи решены? Для дроида я не вижу особых проблем - но я использую vs, а не xs, и я на ПК (это ваш код на mac?) – Stuart

+0

, если вам нужно поговорить более общим «Мысли»? уровень затем msybe попробуйте переключиться на http://forums.xamarin.com/discussion/1549/pcls-and-mvvmcross-in-the-new-tools - stackoverflow отлично подходит для конкретных подробных q и точек. Но это не так хорошо для более общих обсуждений :) – Stuart

+0

Извините! Должна быть более конкретной ... у моего исходного класса активности был только метод OnViewModelSet() с вызовом SetContentView. Это отлично работало в последней версии инструментария, но после того, как я обновил его, был обстрелян NullReferenceExceptpion. Я сделал кое-что и нашел ваше сообщение, указывающее, что метод Oncreate() поможет в определенных сценариях -> хотя сценарий не соответствует моему, я дал ему завихрение, что в конечном итоге привело меня к методу Load() в IMvxViewModel. Я продолжал получать исключение NullReferenceException до тех пор, пока не внес изменения в указанный выше метод. –

ответ

1

Я понятия не имею, какова ваша текущая проблема с новыми инструментами Xamarin. Ваше описание NullReferenceExceptions, измененных файлов и сообщений в блогах потеряло меня ...

Я бы предположил, что в вашей настройке разработки и, возможно, в вашем приложении, возможно, изменилось несколько вещей. Если вы сможете отработать один шаг за раз, возможно, тогда вы сможете решить, что такое изменение ключа.

Похоже, что исправление кода может исправить, может исправить вашу текущую проблему, но это определенно патч, примененный после проблемы (независимо от того, что это такое), поэтому это не то, что я хотел бы сделать в основном коде прямо сейчас.


С точки зрения кода вы просили о:

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

Это первый нуль будет происходить только тогда, когда активность каким-то образом был создан без Intent - который я предполагаю, это не происходит? (Если возможно, где-то в вашей текущей настройки оснастки это не так или иначе задается как нуль?)


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

Это нормальный путь для непосредственно запущенного деятельности - эта деятельность не будет иметь никаких дополнительных параметров для построения ViewModel ,

Как правило, этот путь не встречается во многих приложениях MvvmCross - большинство приложений запускается с помощью действия splashscreen.


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

Для любой другой деятельности, MVX должны вставили некоторую специальную информацию ViewModel в Extras - так что нет никакого способа Extras должен быть пустым ... Если это происходит, то, что код является создание Мероприятия?


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

 Смежные вопросы

  • Нет связанных вопросов^_^