MvvmCross 初始 IMvxViewModel ViewAppeared 在 Android 上的 MvxTabbbedPage 中未被调用
MvvmCross initial IMvxViewModel ViewAppeared not being called when in an MvxTabbbedPage on Android
我们的 Xamarin.Forms 项目中有一个 MvxTabbedPage
和 child MvxContentPage
。
在 Android,我发现我的第一个 child 页面上的 ViewAppeared
覆盖在第一次显示 MvxTabbedPage
时没有被调用。
切换标签页时,它随后被正确调用。
我正在为 MvxTabbedPage
的 PageModel 在 ViewAppearing
中初始化 PageModel,如下所示:
public override async void ViewAppearing()
{
await ShowInitialViewModels();
base.ViewAppearing();
}
private bool viewModelsInitialised = false;
private async Task ShowInitialViewModels()
{
if (!viewModelsInitialised)
{
await _BusyManager.SetBusy();
var tasks = new List<Task>();
tasks.Add(_MvxNavigationService.Navigate<HomePageModel>());
tasks.Add(_MvxNavigationService.Navigate<MyBenefitsPageModel>());
tasks.Add(_MvxNavigationService.Navigate<ClaimsPageModel>());
tasks.Add(_MvxNavigationService.Navigate<ContactUsPageModel>());
tasks.Add(_MvxNavigationService.Navigate<SettingsPageModel>());
await Task.WhenAll(tasks);
viewModelsInitialised = true;
await _BusyManager.SetUnBusy();
}
}
其他人是否看到过这种行为,and/or我应该做些不同的事情吗?
看起来是这个表单错误:
https://github.com/xamarin/Xamarin.Forms/issues/3855
这个 MvvmCross 问题引用了它
https://github.com/MvvmCross/MvvmCross/issues/2823
(感谢 Pedro 在 Slack 上给我指明了这个方向:)
检查 mvvmcross 的 Playground project。您应该在视图模型和后面的 XF 视图代码中分别管理选项卡初始化。
public class YourTabsViewModel : MvxViewModel
{
private readonly IMvxNavigationService _navigationService;
public YourTabsViewModel(IMvxNavigationService navigationService)
{
_navigationService = navigationService;
ShowInitialViewModelsCommand = new MvxAsyncCommand(ShowInitialViewModels);
}
public IMvxAsyncCommand ShowInitialViewModelsCommand { get; private set; }
private async Task ShowInitialViewModels()
{
var tasks = new List<Task>
{
tasks.Add(_navigationService.Navigate<HomePageModel>();
tasks.Add(_navigationService.Navigate<MyBenefitsPageModel>());
tasks.Add(_navigationService.Navigate<ClaimsPageModel>());
tasks.Add(_navigationService.Navigate<ContactUsPageModel>());
tasks.Add(_navigationService.Navigate<SettingsPageModel>());
}
await Task.WhenAll(tasks);
}
}
然后在你的 XF 视图后面的代码
[MvxTabbedPagePresentation(TabbedPosition.Root, NoHistory = true)]
public partial class YourTabsPage : MvxTabbedPage<YourTabsViewModel>
{
public YourTabsPage()
{
InitializeComponent();
}
private bool _firstTime = true;
protected override void OnAppearing()
{
base.OnAppearing();
if (_firstTime)
{
ViewModel.ShowInitialViewModelsCommand.ExecuteAsync(null);
_firstTime = false;
}
}
}
我们的 Xamarin.Forms 项目中有一个 MvxTabbedPage
和 child MvxContentPage
。
在 Android,我发现我的第一个 child 页面上的 ViewAppeared
覆盖在第一次显示 MvxTabbedPage
时没有被调用。
切换标签页时,它随后被正确调用。
我正在为 MvxTabbedPage
的 PageModel 在 ViewAppearing
中初始化 PageModel,如下所示:
public override async void ViewAppearing()
{
await ShowInitialViewModels();
base.ViewAppearing();
}
private bool viewModelsInitialised = false;
private async Task ShowInitialViewModels()
{
if (!viewModelsInitialised)
{
await _BusyManager.SetBusy();
var tasks = new List<Task>();
tasks.Add(_MvxNavigationService.Navigate<HomePageModel>());
tasks.Add(_MvxNavigationService.Navigate<MyBenefitsPageModel>());
tasks.Add(_MvxNavigationService.Navigate<ClaimsPageModel>());
tasks.Add(_MvxNavigationService.Navigate<ContactUsPageModel>());
tasks.Add(_MvxNavigationService.Navigate<SettingsPageModel>());
await Task.WhenAll(tasks);
viewModelsInitialised = true;
await _BusyManager.SetUnBusy();
}
}
其他人是否看到过这种行为,and/or我应该做些不同的事情吗?
看起来是这个表单错误:
https://github.com/xamarin/Xamarin.Forms/issues/3855
这个 MvvmCross 问题引用了它
https://github.com/MvvmCross/MvvmCross/issues/2823
(感谢 Pedro 在 Slack 上给我指明了这个方向:)
检查 mvvmcross 的 Playground project。您应该在视图模型和后面的 XF 视图代码中分别管理选项卡初始化。
public class YourTabsViewModel : MvxViewModel
{
private readonly IMvxNavigationService _navigationService;
public YourTabsViewModel(IMvxNavigationService navigationService)
{
_navigationService = navigationService;
ShowInitialViewModelsCommand = new MvxAsyncCommand(ShowInitialViewModels);
}
public IMvxAsyncCommand ShowInitialViewModelsCommand { get; private set; }
private async Task ShowInitialViewModels()
{
var tasks = new List<Task>
{
tasks.Add(_navigationService.Navigate<HomePageModel>();
tasks.Add(_navigationService.Navigate<MyBenefitsPageModel>());
tasks.Add(_navigationService.Navigate<ClaimsPageModel>());
tasks.Add(_navigationService.Navigate<ContactUsPageModel>());
tasks.Add(_navigationService.Navigate<SettingsPageModel>());
}
await Task.WhenAll(tasks);
}
}
然后在你的 XF 视图后面的代码
[MvxTabbedPagePresentation(TabbedPosition.Root, NoHistory = true)]
public partial class YourTabsPage : MvxTabbedPage<YourTabsViewModel>
{
public YourTabsPage()
{
InitializeComponent();
}
private bool _firstTime = true;
protected override void OnAppearing()
{
base.OnAppearing();
if (_firstTime)
{
ViewModel.ShowInitialViewModelsCommand.ExecuteAsync(null);
_firstTime = false;
}
}
}