FreshMVVM Navigation выдает исключение при выходе из модальной страницы - PullRequest
0 голосов
/ 13 января 2020

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

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

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

Соответствующие версии: Xamarin. Forms v3.6.0.264807 Плагин FreshMvvm v3.0.0. Локальное уведомление от 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);
}

Stacktrace

FreshTinyIo C .TinyIoCResolutionException Сообщение = Ошибка при разрешении: IFreshNavigationService Source = mscorlib StackTrace: при FreshTinyIo C .FreshTinyIoCContainer.ResolveInternal (FreshToIoReo) 1025 * .NamedParameterOverloads параметры, параметры FreshTinyIo C .ResolveOptions) [0x0 00f7] в C: \ Projects \ FreshMvvm \ src \ FreshIOC \ FreshTinyIO C .cs: 3142 в FreshTinyIo C .FreshTinyIoCContainer.Resolve (System.Type resolvType, System.String name) [0x00000] в C: \ Projects \ FreshMvvm \ src \ FreshIOC \ FreshTinyIO C .cs: 1211 в FreshTinyIo C .FreshTinyIoCContainer.Resolve [ResolveType] (имя System.String) [0x00000] в C: \ Projects \ FreshMvvm \ src \ FreshIOC \ FreshTinyIO C .cs: 1332 в FreshMvvm.FreshTinyIOCBuiltIn.Resolve [ResolveType] (имя System.String) [0x00000] в C: \ Projects \ FreshMvvm \ src \ FreshMvvm \ FreshTinyIOCU FreshMvvm.PageModelCoreMethods.PushNewNavigationServiceModal (FreshMvvm.IFreshNavigationService newNavigationService, FreshMvvm.FreshBasePageModel [] basePageModels, System.Boolean одушевленные) [0x00073] в C: \ Projects \ FreshMvvm \ SRC \ FreshMvvm \ PageModelCoreMethods.cs: 178 в FreshMvvm.PageModelCoreMethods. PushPageModelWithNewNavigation [T] (данные System.Object, анимация System.Boolean) [0x00060] в C: \ Projects \ FreshMvvm \ src \ FreshMvvm \ PageModelCoreMethods.cs: 235 по адресу cdaxrobot.PageModels.NotificationPageModel. Go () [0x00225] в C: \ Work \ RobotApp \ App \ cdaxrobot \ cdaxrobot \ cdaxrobot \ PageModel.SM: .Runtime.CompilerServices.AsyncMethodBuilderCore + <> c .b__7_0 (состояние System.Object) [0x00000] в / Users / builder / jenkins / workspace / archive-mono / 2019-08 / android / release / mcs / class / Referenceource / mscorlib / system / runtime / compilerservices / AsyncMethodBuilder.cs: 1021 at Android .App.SyncContext + <> c__DisplayClass2_0.b__0 () [0x00000] в <11f101b564894ca7af6c482ddc51l. ) [0x00008] в <11f101b564894ca7af6c482ddc51c698>: 0 в Java .Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr, родной__this) [0x00009] в wra 11f101646: 686: 0646: 486: 064: 064: 06464: dc: 064: 064: 064: 064: 064: 064: 064: 064: 064: 064. Android .Runtime.DynamicMethodNameCounter.41 (intptr, intptr)

1 Ответ

0 голосов
/ 16 января 2020

Спасибо за ответ. Мне удалось это исправить, создав новый 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();
}
...