CoreDispatcher。HasThreadAccess&;颠覆性更改&; [英] CoreDispatcher.HasThreadAccess "breaking change"
问题描述
我接管了一个用MvvmCross.vNext开发的应用程序。
在尝试用MvvmCross.V3更新它时,我发现了以下突破性的变化:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。
它在vNext中运行良好。
但在V3中,不会显示LoginView。
经过长搜索,我发现添加到MvxStoreMainThreadDispatcher.RequestMainThreadAction中的以下代码:
if (_uiDispatcher.HasThreadAccess)
{
action();
return true;
}
对我的麻烦负责。
如果我将其注释掉,我的应用程序会像以前一样工作,但我猜这段代码是出于某些原因而存在的...
您有什么建议吗?
我可以在不更改MvvmCross源代码的情况下强制执行上一个行为吗?
我是否应该重构代码以不同方式处理LoginView?
提前感谢您的评论。
菲利普
推荐答案
在尝试使用MvvmCross.V3更新它时,我发现了以下突破性更改:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。它在vNext中运行正常。
我认为在任何MvvmCross版本中,您的构造函数导航都会在多个平台上中断。老实说,我认为你很幸运,它以前奏效了。
问题是,视图模型是在查看事件(如ViewDidLoad
、OnNavigatedTo
和OnCreate
)期间构造(或定位)的-这些事件通常
在‘页面转换’期间调用
若要解决此问题,您需要将登录导航移出构造函数。
具体操作方式取决于您的应用
如果您确实需要Home->Login Back Stack,那么您可以触发一些异步或延时,或者您可以触发一些其他的View事件,例如
ViewDidAppear
如果您不需要后栈,那么我通常实现这种事情方式是使用自定义的
IMvxAppStart
-类似于:public class AppStart : MvxNavigatingObject , IMvxAppStart { public void Start(object hint = null) { var authService = Mvx.Resolve<IMySerice>(); if (authService.IsLoggedIn) { ShowViewModel<HomeViewModel>(); } else { ShowViewModel<LoginViewModel>(); } } }
可以使用以下命令在App.cs启动中注册:
RegisterAppStart(new AppStart());
这篇关于CoreDispatcher。HasThreadAccess&;颠覆性更改&;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!