我可以将参数从 MvxSplashScreenActivity 发送到 MvxViewModel 吗?

Can I send parameters from MvxSplashScreenActivity to MvxViewModel?

我正在处理我的第一个 MvvmCross 项目,我正在使用启动画面从 sqlite 数据库获取一些用户数据,并根据有或没有数据启动登录或主视图模型。 然后我想将这些数据发送到 MainViewModel。我想知道是否可以制作以及如何制作。 这是我的 MvxSplashScreenActivity 代码:

[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashScreen : MvxSplashScreenActivity
{
    protected override void OnResume()
    {
        base.OnResume();
        Task startupWork = new Task(() => { SimulateStartup(); });
        startupWork.Start();
    }

    async void SimulateStartup()
    {

        Task<Core.Models.TrackrUserData> result = Mvx.Resolve<RepositoryService>().GetUserDataAsync();
        await Task.Delay(2000); 
        Core.Models.TrackrUserData userData = result.Result;
        if(userData != null){
            await GetProjects(userData);
            await Task.Delay(1000);
        }else{
            await Task.Delay(1000); 
        }
    }

    async Task<bool> GetProjects(Core.Models.TrackrUserData login)
    {
        var apiService = new ApiService();
        var respuesta = await apiService.GetProjects(login.IdUser.ToString(), login.ActiveTeamId.ToString(), login.Jwt);
        await Mvx.Resolve<RepositoryService>().DeleteProjects();
        var projectsSaved = SaveProjects(respuesta);
        return true;
    }

    async Task<bool> SaveProjects(List<ProjectGetResponse> respuesta)
    {
        foreach (var item in respuesta)
        {
            await Mvx.Resolve<RepositoryService>().CreateProject(new Project
            {
                Id = item.Id,
                Name = item.Name
            });
        }
        return true;
    }
}

提前致谢!

我不建议您在视图级别执行所有异步工作。业务逻辑和繁重的工作不是视图的关注点。想一想:如果您要创建应用程序的 iOS 版本,您也需要复制该平台上的所有代码...

您可以利用 MvvmCross 提供的 MVVM 实现,并在核心级别执行所有操作。

为此,您可以按照以下步骤操作:

1) 创建一个从 MvxNavigationServiceAppStart.

派生的 class

2) 覆盖 Start 方法并确保在该方法结束之前导航到 ViewModel(在您的情况下为 MainViewModel)。

3) 在导航之前,您可以执行您想要的所有操作。但是,如果您要执行 async/await,您最终会得到一个 async void Start 方法……这并不是很好。所以我在这里的建议是存储一个简单的值来使用 this plugin 之类的东西做出初始决定并快速加载。

4) 之后,您可以在初始 ViewModel 上完成所有繁重的工作(也许 MainViewModel?)。

最终提示:您应该考虑在构造函数中使用依赖注入加载所有依赖项,而不是通过 IoC 容器解析它们。