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;
        }
    }
}