Навигация MAUI возвращает значение Null

Итак, у меня есть код, который я должен преобразовать в MAUI из XAMARIN. Вопрос в том, что я написал код, который как бы делает свою страницу с информацией. Все функции информационной части работают нормально. Проблема в том, что когда предполагается открыть страницу, заполненную информацией, в основном страница не открывается. В версии XAMARIN мы создали NavigationManager для навигации по страницам. Всякий раз, когда он подходит к методу навигации, он говорит, что он нулевой. Я не первый раз сталкиваюсь с этой проблемой. Когда я впервые столкнулся с этой проблемой, я загрузил пакет NuGet NavigatableElement, который поставляется с Microsoft.Maui.Controls. И вот как я это исправил сначала:

private async void DataPacketsButton_Clicked(object sender, EventArgs e)
        {
                //This is the old version that I used the NavigationManager That I have Created.
                //var manageDataPacketsPage = new ManageDataPacketsPage();
                //await NavigationManager.Instance.Navigation.PushAsync(manageDataPacketsPage, true);               
                //This is the method that I used the NuGet Package NavigatableElement.
                await Navigation.PushAsync(new ManageDataPacketsPage());
        }

Это тот, который я пытаюсь преобразовать в NavigatableElement:

        public async Task OpenParcelPage(string plotId)
        {
                var page = new ParcelPage();
                page.Fill(plotId);

                //This does not see the NavigatableElement Package. So its returning the "Navigation" Object null.
                await NavigationManager.Instance.Navigation.PushAsync(page);
        }

Это NavigationManager, который я создал:

public class NavigationManager
    {
        public INavigation Navigation { get; private set; }

        #region Singleton
        private static readonly object _lock = new object();
        private static readonly object _updateLock = new object();
        private static NavigationManager instance = null;

        public static NavigationManager Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (_lock)
                    {
                        if (instance == null)
                        {
                            instance = new NavigationManager();
                        }
                    }
                }
                return instance;
            }
        }

Как я могу решить эту проблему?

Добавьте в вопрос код, устанавливающий свойство навигации. Кроме того, хотя это и не является причиной проблемы, вы можете просто установить экземпляр в «статическом конструкторе». Тогда замок не нужен. Или установите его встроенным в объявление поля.

ToolmakerSteve 19.04.2023 15:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В качестве альтернативы, с помощью INaviagtion, вы можете написать свой собственный сервис просмотра для навигации по страницам.

Вот фрагмент кода для справки при переходе с первой страницы на вторую:

  1. Создайте службу просмотра: ViewServices.cs

public static class ViewServices 
{
       private static IServiceCollection Services;

       public static MauiAppBuilder UseViewServices(this MauiAppBuilder builder)
       {
            Services = builder.Services;
            return builder;
       }

        public static ContentPage ResolvePage<TService>(params object[] inputParameters)
        {
            var implementationType = Services
                                    .Where(service => service.ServiceType == typeof(TService) && service.ImplementationType != null)
                                    .Select(service => service.ImplementationType)
                                    .First();

           return (Activator.CreateInstance(implementationType, inputParameters)) as ContentPage;
        }
}

  1. Создайте два интерфейса соответственно:
public interface IFirstPage 
{
}
public interface ISecondPage 
{
}

  1. В коде первой страницы обратите внимание, что на второй странице также необходимо реализовать ISecondPage
public partial class FirstPage : ContentPage,IFirstPage 
{
      public FirstPage()
      {
            InitializeComponent();

            BindingContext = new FirstPageViewModel(this.Navigation);
      }
}

Первая страница.xaml:

<VerticalStackLayout> 
        <Label 
            Text = "Welcome to .NET MAUI!"
            VerticalOptions = "Center" 
            HorizontalOptions = "Center" />


        <Button
            Text = "Take me to 2nd Page"
            Command = "{Binding NavigateToSecondPageCommand}" />
</VerticalStackLayout>

  1. Фистпажевиевмоде.cs
public partial class FirstPageViewModel 
{
    private INavigation _navigationService;

    public FirstPageViewModel(INavigation navigation) 
    { 
            this._navigationService= navigation; 
    }

    [RelayCommand]
    async void NavigateToSecondPage()
    {
         await _navigationService.PushAsync(ViewServices.ResolvePage<ISecondPage>());
     }
}

5. В App.xaml.cs измените начальную страницу, как показано ниже:

MainPage = new NavigationPage(ViewServices.ResolvePage<IFirstPage>());
  1. MauiProgram.cs
public static MauiApp CreateMauiApp() 
{
       var builder = MauiApp.CreateBuilder();
       builder
                  .UseMauiApp<App>()
                  .ConfigureFonts(fonts =>
                  {
                        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                        fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                  })
                  //don't forget adding the view service
                 .UseViewServices();

        builder.Services.AddSingleton<IFirstPage, FirstPage>();
        builder.Services.AddTransient<ISecondPage, SecondPage>();
        return builder.Build();
}

Ответ принят как подходящий

Причина, по которой диспетчер навигации возвращал значение null, заключалась в том, что я не реализовал это на главной странице.

 public MainPage()
        {
            InitializeComponent();

            //This is the one.
            NavigationManager.Instance.SetNavigation(Navigation);
        } 

Я знаю, что не так много людей делают свой собственный менеджер навигации. То, что я должен сделать, на самом деле прочитать и сделать, как Александр сказал мне выше. Но если кто-то наткнется на эту проблему, они могут исправить это следующим образом.

Другие вопросы по теме