FreshMVVM Navigation выдает исключение при выходе с модальной страницы

Я использую плагин LocalNotification (nuget) для создания телефонного уведомления о событии, которое отлично работает. Если пользователь переходит на страницу со списком уведомлений и выбирает ее, он переходит на страницу NotificationPageModel.cs. Оттуда они нажимают кнопку, которая уводит их прочь, которая работает до тех пор, пока к ней осуществляется ручной переход.

Если пользователь нажимает на уведомление телефона (app.xaml.cs: OnLocalNotificationTapped), то при попытке уйти он генерирует исключение FreshTinyIoC.TinyIoCResolutionException.

Как я могу уйти со страницы, когда пользователь щелкнул уведомление (masterDetailNav.Navigation.PushModalAsync(npage);)?

Соответствующие версии: Xamarin.Forms v3.6.0.264807 FreshMvvm v3.0.0 Plugin.LocalNotification by Thudugala v4.0.5

App.xaml.cs

void OnLocalNotificationTapped(NotificationTappedEventArgs e)
{
    var _logger = FreshMvvm.FreshIOC.Container.Resolve<ILoggingService>();
    _logger.Info("Pressed notification: {0}", e.Data);
    Notification notification = new Notification();
    if (string.IsNullOrWhiteSpace(e.Data))
    {
        return;
    }
    else
    {
        notification = JsonConvert.DeserializeObject<Notification>(e.Data);
    }

    //CoreMethods.PushPageModel<NotificationPageModel>(notification); //cant find coremethods
    var npage = FreshPageModelResolver.ResolvePageModel<NotificationPageModel>(notification);
    masterDetailNav.Navigation.PushModalAsync(npage);
}

NotificationPageModel.cs:

public async void Cancel()
{
    _logger.Info("Notification {0} Cancel: {1}", Notification.Gateway, Notification.TimeStamp);

    //Navigate away from page
    //await CoreMethods.PopPageModel(); //this only works if manually navigated to
    //attempt #1
    await CoreMethods.PushPageModel<HomePageModel>();
}

public async void Remove()
{
    _logger.Info("Notification {0} Remove: {1}", Notification.Gateway, Notification.TimeStamp);

    //Remove notification
    try
    {
        _user.Notifications.Remove(Notification);
    }
    catch (Exception ex)
    {
        _logger.Warn("Remove Notification: {0}", ex.Message);
    }

    //Navigate away from page
    //await CoreMethods.PopPageModel(); //this only works if manually navigated to
    //attempt #2
    var hpage = FreshPageModelResolver.ResolvePageModel<HomePageModel>();
    await CoreMethods.PushPageModelWithNewNavigation<HomePageModel>(hpage);
}

Трассировки стека

FreshTinyIoC.TinyIoCResolutionException Message = Resolve не удалось: IFreshNavigationService Source = mscorlib StackTrace: при (регистрации FreshTinyIoC.FreshTinyIoCContainer + TypeRegistration, параметры FreshTinyIoC.NamedParameterOverloads, опции FreshTinyIoC.ResolveOptions) FreshTinyIoC.FreshTinyIoCContainer.ResolveInternal [0x000f7] в C: \ Проекты \ FreshMvvm \ SRC \ FreshIOC \ FreshTinyIOC.cs: 3142 в FreshTinyIoC.FreshTinyIoCContainer.Resolve (System.Type resolveType, System.String name) [0x00000] в C: \ Projects \ FreshMvvm \ src \ FreshIOC \ FreshTinyIOC.cs: 1211 в FreshTinyIOC.cs: 1211 в FreshTinyIOC.cs Разрешите [ResolveType] (имя System.String) [0x00000] в C: \ Projects \ FreshMvvm \ src \ FreshIOC \ FreshTinyIOC.cs: 1332 в FreshMvvm.FreshTinyIOCBuiltIn.Resolve [ResolveType] (имя System.String000) в [0x00 : \ Projects \ FreshMvvm \ src \ FreshMvvm \ FreshTinyIOCBuiltIn.cs: 31 в FreshMvvm.PageModelCoreMethods.PushNewNavigationServiceModal (FreshMvvm.IFreshNavigationSer вице-newNavigationService, FreshMvvm.FreshBasePageModel [] basePageModels, System.Boolean animate) [0x00073] в C: \ Projects \ FreshMvvm \ src \ FreshMvvm \ PageModelCoreMethods.cs: 178 в FreshMvvm.CoreMethods.cs: 178 в FreshMvvm.PageMethods. System.Boolean animate) [0x00060] в C: \ Projects \ FreshMvvm \ src \ FreshMvvm \ PageModelCoreMethods.cs: 235 в cdaxrobot.PageModels.NotificationPageModel.Go () [0x00225] в C: \ App \ Work \ RobdotAppro \ cdaxrobot \ cdaxrobot \ PageModels \ NotificationPageModel.cs: 113 в System.Runtime.CompilerServices.AsyncMethodBuilderCore + ‹> c.b__7_0 (состояние System.Object) [0x00000] в / Users / builder / jenkins / mono / 2019 / archive- /android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021 в Android.App.SyncContext + ‹> c__DisplayClass2_0.b__0 () [0x00000] в ‹11f101c6482ca1 .Thread + RunnableImplementor.Run () [0x00008] в ‹11f 101b564894ca7af6c482ddc51c698>: 0 в Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] в ‹11f101b564894ca7af6c482dddc51c698 динамическом методе )


person Widgetaah    schedule 13.01.2020    source источник
comment
Если вы нажимаете ModalPage в NavigationStack и хотите открыть эту страницу, вы должны использовать метод PopPageModel из CoreMethods, а затем передать логическое значение в качестве параметра, чтобы сообщить методу Pop, что это модальная страница. PopPageModel имеет два переопределения, где этот параметр является первым и вторым соответственно. FMI: github.com/rid00z/FreshMvvm/blob/master/ src / FreshMvvm /   -  person FreakyAli    schedule 13.01.2020


Ответы (1)


Спасибо за ответ. Мне удалось это исправить, создав новый NavigationContainer:

notificationPage = FreshMvvm.FreshPageModelResolver.ResolvePageModel<NotificationPageModel>(true);
notificationContainer = new FreshNavigationContainer(notificationPage, Models.Constants.NotificationContainer);

void OnLocalNotificationTapped(NotificationTappedEventArgs e)
{
    MainPage = notificationContainer;
}

а затем на странице я делаю это:

if (CameFromNotification == true)
{
    _logger.Debug("Navigating back to MainContainer");
    CoreMethods.SwitchOutRootNavigation(Models.Constants.MainContainer);
}
else
{
    _logger.Debug("Navigating by popping the stack");
    await CoreMethods.PopPageModel();
}
person Widgetaah    schedule 16.01.2020