我正在接管使用MvvmCross.vNext开发的应用程序 在尝试使用MvvmCross.V3更新它时,我发现了以下重大变化:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。 它在vNext中运行良好 但是使用V3时,LoginView不会显示 经过长搜索后,我发现以下代码添加在 MvxStoreMainThreadDispatcher.RequestMainThreadAction 中:
if (_uiDispatcher.HasThreadAccess)
{
action();
return true;
}
对我的麻烦负责
如果我评论它,我的应用程序像以前一样工作,但我想这个代码是出于某些原因... ...
你有什么建议吗?
我可以在不更改MvvmCross源代码的情况下强制执行上一行为吗?
我应该重构代码以不同的方式处理LoginView吗?
提前感谢您的意见。
菲利普
答案 0 :(得分:1)
在尝试使用MvvmCross.V3更新它时,我发现了以下重大变化:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。它在vNext中运行良好。
我认为你的构造函数导航在任何MvvmCross版本的几个平台上都会破坏。说实话,我觉得你以前很幸运。
问题是ViewModel是在ViewDidLoad
,OnNavigatedTo
和OnCreate
等View事件中构建(或定位)的 - 这些事件通常都是
在“页面转换”期间调用
要解决此问题,您将需要将登录导航移出构造函数。
如何执行此操作取决于您的应用
如果您确实需要Home-> Login backstack,那么您可以触发一些异步或时间延迟,或者您可以触发其他一些View事件,例如ViewDidAppear
如果您不需要该Backstack,那么我通常实现这种方式的方法是使用自定义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());