Caliburn.Micro alpha 4.0.0-alpha1, DisplayRootView <TestViewModel>() завершается ошибкой с «NavigationPage должна быть страница root» - PullRequest
0 голосов
/ 10 марта 2020

Я использую Caliburn.Micro с Xamarin.Forms для производственного приложения. Однако из-за несовместимости с другими пакетами мне пришлось перейти на netstandard 2.0. Итак, я использую CM версии 4.0.0-alpha.1. Он отлично работает в симуляторе и на устройстве, однако у меня сейчас проблема с отладкой приложения. Отладчик не подключается к устройству, и это происходит только в новой версии, где CM установлен как 4.0.0-alpha.1 (у меня есть открытый вопрос на форумах Xamarin и один здесь по этому поводу, но никто не кажется чтобы понять, что может быть причиной. Попробовал все: очистить, удалить bin-obj, перезагрузить компьютер, устройства, проверить права. Несмотря ни на что, я больше не могу отлаживать свой проект на физических устройствах, хотя он будет работать без подключенного отладчика) .

Итак, я создал новый чистый тестовый проект и установил в него CM 4.0.0-alpha.1. Я просто хочу исключить эту альфа-версию, так или иначе являющуюся виновником (единственное другое отличие от более ранней версии проекта - некоторые дополнительные пакеты стабильного выпуска, которые я установил).

Однако, когда я запускаю эту В тестовом проекте App.xaml.cs выдает 2 исключения в следующей строке:

DisplayRootView<TestViewModel>();
  • Ссылка на объект не установлена ​​на экземпляр объекта. После:
  • NavigationPage должен иметь Страница root перед использованием. Либо вызовите PushAsyn c с допустимой страницей, либо передайте страницу конструктору перед использованием.

Я нигде не ссылаюсь на NavigationPage. Трассировка стека для сообщения ссылки на пустой объект не показывает ничего полезного. Это очень простой c проект с одним видом / виртуальной машиной. Я считаю, что весь соответствующий код приведен ниже.

Кто-нибудь знает, что может быть причиной ошибки? Возможно, мне не хватает чего-то простого, но я не вижу этого.

Редактировать: я понял, что мне не хватает метода переопределения PrepareViewFirst. Я включил это сейчас. Однако, когда вызывается следующая строка:

container.Instance<INavigationService>(new NavigationPageAdapter(navigationPage));

Выдается следующее исключение:

{System.NullReferenceException: Object reference not set to an instance of an object
  at Caliburn.Micro.ContainerExtensions.Instance[TService] (Caliburn.Micro.SimpleContainer container, TService instance) [0x00000] in <8255c5098d75408b9dd3ebb0e98070d2>:0 
  at TUE.App.PrepareViewFirst (Xamarin.Forms.NavigationPage navigationPage) 

AppDelegate.cs:

[Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        private App _theApp;


        private readonly CaliburnAppDelegate appDelegate = new CaliburnAppDelegate();
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();
            _theApp = IoC.Get<App>();
            LoadApplication(_theApp);
            return base.FinishedLaunching(app, options);
        }
    }

App.xaml. cs:

    public partial class App : FormsApplication
        {
            public App()
            {
                Initialize();
                InitializeComponent();
                //InitializeComponent();
                //MainPage = new MainPage();
            }


            public App(SimpleContainer container)
            {
                container
                    .PerRequest<TestViewModel>();

                Initialize();
                InitializeComponent();

                try
                {
                    //error is thrown here
                    DisplayRootView<TestViewModel>();
                }
                catch(Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("The Error");
                }
            }

   protected override void PrepareViewFirst(NavigationPage navigationPage)
        {
            try
            {
                container.Instance<INavigationService>(new NavigationPageAdapter(navigationPage));
            }
            catch(Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Another Error");
            }
        }
    }

CaliburnAppDelegate.cs:

public class CaliburnAppDelegate : CaliburnApplicationDelegate
    {
        private SimpleContainer container;

        public CaliburnAppDelegate()
        {
            Initialize();
        }

        protected override void Configure()
        {
            container = new SimpleContainer();
            container.Instance(container);
            container.Singleton<App>();
            container.Singleton<IEventAggregator, EventAggregator>();

        }

        protected override void BuildUp(object instance)
        {
            container.BuildUp(instance);
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return container.GetAllInstances(service);
        }

        protected override object GetInstance(Type service, string key)
        {
            return container.GetInstance(service, key);
        }

        protected override IEnumerable<Assembly> SelectAssemblies()
        {
            return new[]
            {
                GetType().Assembly,
                typeof(TestViewModel).Assembly
            };
        }
    }

TestView.xaml:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="TUE.TestView">
    <ContentPage.Content>
        <Label Text="{Binding WelcomeMessage}"/>
    </ContentPage.Content>
</ContentPage>

TestViewModel.cs:

public class TestViewModel : Screen
    {
        public string WelcomeMessage { get; set; } = "Hello CM";
    }
...