首页 文章

mvvmCross中片段的生命周期

提问于
浏览
0

在mvvmCross中使用片段时出现以下问题 . 我借用了https://github.com/slodge/MvvmCross-Tutorials/tree/master/Fragments的代码 . https://github.com/slodge/MvvmCross-Tutorials/blob/master/Fragments/FragmentSample.UI.Droid/Setup.cs中的Framepresenter类解析了在show方法中显示视图模型的请求

public class CustomPresenter
        : MvxAndroidViewPresenter
        , ICustomPresenter
    {
        private Dictionary _dictionary = new Dictionary();

        public override void Show(MvxViewModelRequest request)
        {
            IFragmentHost host;
            if (_dictionary.TryGetValue(request.ViewModelType, out host))
            {
                if (host.Show(request))
                {
                    return;
                }
            }

            base.Show(request);
        }
...

在第一轮比赛中一切顺利 . 如果我用android的“后退”按钮关闭应用程序并再次打开它,我将在基类的Show方法(MvxAndroidViewPresenter)中获得空指针异常 . 这是因为顶级活动不再存在 . MvxAndroidViewPresenter中的属性Activity返回null . 重新启动应用程序时,如何重新创建顶级活动?

我得到以下异常

06-26 16:06:28.102 I/MonoDroid( 6791): UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxAndroidViewPresenter.Show (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x0000f] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxAndroidViewPresenter.cs:29
06-26 16:06:28.102 I/MonoDroid( 6791): at ManCockpit.UI.Droid.CockpitFragmentPresenter.Show (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x00040] in d:\Projekte\ManCockpitV2\ManCockpit.UI.Droid\CockpitFragmentPresenter.cs:41
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxAndroidViewDispatcher/c__DisplayClass1.b__0 () [0x00000] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxAndroidViewDispatcher.cs:27
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxAndroidViewDispatcher.ShowViewModel (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x00015] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxAndroidViewDispatcher.cs:27
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModelImpl (System.Type,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.MvxRequestedBy) 
06-26 16:06:28.102 I/MonoDroid( 6791): at (wrapper dynamic-method) objec06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModel (System.Type,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.MvxRequestedBy) 
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModel (Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.MvxBundle,Cirrious.MvvmCross.ViewModels.MvxRequestedBy) 
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxAppStart`1.Start (object) 
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxSplashScreenActivity.TriggerFirstNavigate () [0x00007] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxSplashScreenActivity.cs:82
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxSplashScreenActivity.InitializationComplete () [0x00001] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxSplashScreenActivity.cs:76
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Platform.MvxAndroidSetupSingleton.InitialiseFromSplashScreen (Cirrious.MvvmCross.Droid.Views.IMvxAndroidSplashScreenActivity) [0x00036] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Platform\MvxAndroidSetupSingleton.cs:76
06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxSplashScreenActivity.OnCreate (Android.OS.Bundle) [0x00014] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxSplashScreenActivity.cs:47
06-26 16:06:28.102 I/MonoDroid( 6791): at ManCockpit.UI.Droid.SplashScreenActivity.OnCreate (Android.OS.Bundle) [0x0002e] in d:\Projekte\ManCockpitV2\ManCockpit.UI.Droid\SplashScreenActivity.cs:105
06-26 16:06:28.102 I/MonoDroid( 6791): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00010] in /Users/builder/data/lanes/monodroid-lion-bs1/0cc7ae3b/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.App.Activity.cs:1859
06-26 16:06:28.102 I/MonoDroid( 6791): at (wrapper dynamic-method) object.08473369-0d89-4344-a57c-40e97793bab8 (intptr,intptr,intptr)

1 回答

  • 0

    看起来这与Fragments无关 - 而是一个已知的错误 - https://github.com/slodge/MvvmCross/issues/316

    对此的修复尚未发布到nuget .

    要解决它,您可以自己构建修复程序 . 或者,您可以通过添加以下内容来覆盖splashscreen类中的行为:

    private bool _isResumed;
    
         protected override void OnResume()
         {
             _isResumed = true;
             base.OnResume();
         }
    
         protected override void OnPause()
         {          
            _isResumed = false;
            base.OnPause();
         }
    
         public override void InitializationComplete()
         {
            if (!_isResumed)
                return;
    
             TriggerFirstNavigate();
         }
    

相关问题