0

我正在接管使用 MvvmCross.vNext 开发的应用程序。
在尝试使用 MvvmCross.V3 对其进行更新时,我发现了以下重大更改:在 MainViewModel 的构造函数中,我们显示了 LoginViewModel (ShowViewModel())。它在 vNext 中运行良好。
但是在 V3 中,LoginView 不显示。
经过长时间的搜索,我发现在MvxStoreMainThreadDispatcher.RequestMainThreadAction中添加了以下代码:

        if (_uiDispatcher.HasThreadAccess)
        {
            action();
            return true;
        }

对我的麻烦负责。
如果我将其注释掉,我的应用程序会像以前一样工作,但我想这段代码是出于某种原因......
你有什么建议吗?
我可以在不更改 MvvmCross 源代码的情况下强制以前的行为吗?
我应该重构代码以不同方式处理 LoginView 吗?
提前感谢您的评论。
菲利普

4

1 回答 1

1

在尝试使用 MvvmCross.V3 对其进行更新时,我发现了以下重大更改:在 MainViewModel 的构造函数中,我们显示了 LoginViewModel (ShowViewModel())。它在 vNext 中运行良好。

我认为您的构造函数导航会在任何 MvvmCross 版本的多个平台上中断。老实说,我认为你很幸运它以前工作过。

问题是 ViewModel 是在 View 事件期间构建(或定位)的,例如ViewDidLoadOnNavigatedToOnCreate- 并且这些事件通常在“页面转换”期间调用

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

你如何做到这一点取决于你的应用程序

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

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

    这可以使用以下方法在 App.cs 启动中注册:

    RegisterAppStart(new AppStart());
    
于 2013-04-19T16:25:21.500 回答