首页 > 解决方案 > FreshMVVM 导航在离开模态页面时抛出异常

问题描述

我正在使用 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

应用程序.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 消息=解决失败:IFreshNavigationService Source=mscorlib StackTrace:在 FreshTinyIoC.FreshTinyIoCContainer.ResolveInternal(FreshTinyIoC.FreshTinyIoCContainer+TypeRegistration 注册,FreshTinyIoC.NamedParameterOverloads 参数,FreshTinyIoC.ResolveOptions 选项)[0x00reFshMv7] 在 C\ \FreshIOC\FreshTinyIOC.cs:3142 在 FreshTinyIoC.FreshTinyIoCContainer.Resolve (System.Type resolveType, System.String name) [0x00000] 在 C:\Projects\FreshMvvm\src\FreshIOC\FreshTinyIOC.cs:1211 在 FreshTinyIoC.FreshTinyIoCContainer。 Resolve[ResolveType] (System.String name) [0x00000] in C:\Projects\FreshMvvm\src\FreshIOC\FreshTinyIOC.cs:1332 at FreshMvvm.FreshTinyIOCBuiltIn.Resolve[ResolveType] (System.String name) [0x00000] in C :\Projects\FreshMvvm\src\FreshMvvm\FreshTinyIOCBuiltIn.cs:31 在 FreshMvvm.PageModelCoreMethods.PushNewNavigationServiceModal (FreshMvvm.IFreshNavigationService newNavigationService, FreshMvvm.FreshBasePageModel[] basePageModels, System.Boolean animate) [0x00073] 在 C:\Projects\FreshMvvm\ \FreshMvvm\PageModelCoreMethods.cs:178 at FreshMvvm.PageModelCoreMethods.PushPageModelWithNewNavigation[T] (System.Object data, System.Boolean animate) [0x00060] in C:\Projects\FreshMvvm\src\FreshMvvm\PageModelCoreMethods.cs:235 at cdaxrobot .PageModels.NotificationPageModel.Go () [0x00225] 在 C:\Work\RobotApp\App\cdaxrobot\cdaxrobot\cdaxrobot\PageModels\NotificationPageModel.cs:113 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.b__7_0 (System.对象状态)[0x00000] 在 Android 的 /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021 中。 App.SyncContext+<>c__DisplayClass2_0.b__0 () [0x00000] in <11f101b564894ca7af6c482ddc51c698>:0 at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <11f101b564894ca7af6c482ddc51c698>:0 at Java_Lang.Thread+RunnableImplementor.Run () [0x00008] .IntPtr jnienv, System.IntPtr native__this) [0x00009] in <11f101b564894ca7af6c482ddc51c698>:0 at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.41(intptr,intptr)b__0 () [0x00000] in <11f101b564894ca7af6c482ddc51c698>:0 at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <11f101b564894ca7af6c482ddc51c698>:0 at Java.LangIn.IRunnableTrjnienv.n_P.Run native__this) [0x00009] in <11f101b564894ca7af6c482ddc51c698>:0 at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.41(intptr,intptr)b__0 () [0x00000] in <11f101b564894ca7af6c482ddc51c698>:0 at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <11f101b564894ca7af6c482ddc51c698>:0 at Java.LangIn.IRunnableTrjnienv.n_P.Run native__this) [0x00009] in <11f101b564894ca7af6c482ddc51c698>:0 at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.41(intptr,intptr)

标签: xamarin.formsnotificationsfreshmvvm

解决方案


感谢您的答复。我设法通过创建一个新的 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();
}

推荐阅读