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

时间:2017-11-04 17:10:44

标签: android xamarin xamarin.android mvvmcross

我正在开发我的第一个MvvmCross项目,我正在使用Splash Screen从sqlite数据库获取一些用户数据,并根据是否有数据启动Login或Main View Model。 然后我想将这些数据发送到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;
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

1)创建一个派生自MvxNavigationServiceAppStart

的类

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

3)在导航之前,您可以执行所需的所有操作。但是如果你要做异步/等待,你最终会得到一个async void Start方法......这并不是很好。所以我的建议是存储一个简单的值,以便使用this plugin之类的内容做出初步决策并快速加载。

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

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