CoreDispatcher。HasThreadAccess&颠覆性更改& [英] CoreDispatcher.HasThreadAccess "breaking change"

查看:0
本文介绍了CoreDispatcher。HasThreadAccess&颠覆性更改&的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我接管了一个用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版本中,您的构造函数导航都会在多个平台上中断。老实说,我认为你很幸运,它以前奏效了。

问题是,视图模型是在查看事件(如ViewDidLoadOnNavigatedToOnCreate)期间构造(或定位)的-这些事件通常 在‘页面转换’期间调用

若要解决此问题,您需要将登录导航移出构造函数。

具体操作方式取决于您的应用

  • 如果您确实需要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>();
            }
        }
    }
    

    (您可以在https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CirriousConference/Cirrious.Conference.Core/ApplicationObjects/AppStart.cs中看到另一个示例)

    可以使用以下命令在App.cs启动中注册:

    RegisterAppStart(new AppStart());
    

这篇关于CoreDispatcher。HasThreadAccess&amp;颠覆性更改&amp;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆