我可以将参数从 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 容器解析它们。
我正在处理我的第一个 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.
派生的 class2) 覆盖 Start 方法并确保在该方法结束之前导航到 ViewModel(在您的情况下为 MainViewModel)。
3) 在导航之前,您可以执行您想要的所有操作。但是,如果您要执行 async/await,您最终会得到一个 async void Start
方法……这并不是很好。所以我在这里的建议是存储一个简单的值来使用 this plugin 之类的东西做出初始决定并快速加载。
4) 之后,您可以在初始 ViewModel 上完成所有繁重的工作(也许 MainViewModel
?)。
最终提示:您应该考虑在构造函数中使用依赖注入加载所有依赖项,而不是通过 IoC 容器解析它们。