微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在 Xamarin Forms 中调用 Navigation.InsertPageBefore() 后导航对我不起作用?

如何解决为什么在 Xamarin Forms 中调用 Navigation.InsertPageBefore() 后导航对我不起作用?

我正在尝试在 Xamarin Forms(5.0.0,使用 ActiveDirectory 的内置登录页面)上实现登录。关于如何完成这项工作的任何想法?

在 App.xaml.cs 的构造函数中,我有

        public App()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new LoginPage());
        }

我实现了带有视图模型的登录页面,在其中我传入了一个回调,该回调应该(根据 documentation)将我的导航根设置为我的主页:

    public partial class LoginPage : ContentPage
    {
        private async Task _handleLoginAsync()
        {
            Navigation.InsertPageBefore(new HomePage(),this);
            await Navigation.PopAsync();
        }

        public LoginPage()
        {
            InitializeComponent();
            BindingContext = new LoginPageviewmodel(_handleLoginAsync);
        }

    }

在视图模型中,我尝试使用 Device.BeginInvokeOnMainThread 登录调用我的(注意,为了简洁/整洁,我没有包含登录逻辑)

        public Command LoginCommand => new Command(LoginUsingAzureAsync);
        private Func<Task>_handleLoginAsync;

        public LoginPageviewmodel(Func<Task> handleLoginAsync)
        {
            _handleLoginAsync = handleLoginAsync;
            LoginCommand.Execute(null);
        }

        internal void LoginUsingAzureAsync()
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                try
                {
                    if (await Login()) == true)
                    {
                        UserDialogs.Instance.HideLoading();
                        await _handleLoginAsync();
                        return;
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.ToString());

                    UserDialogs.Instance.Alert("The login has Failed.");
                }
            });
         }

它成功进入主页,但之后导航到其他页面不起作用。当我调用以下代码时,它进入 OtherPage() 构造函数,但无法呈现新页面

   Navigation.PushAsync(new OtherPage());

请注意,如果我使用 PushAsync(new HomePage()) 而不是删除登录,导航会按预期工作,但我更愿意从导航堆栈中删除登录页面

提前致谢!


更新:这是初始的 Homeviewmodel:

    public class Homeviewmodel
    {
        private readonly INavigation _navigation;

        public Command GoToOtherPageCommand => new Command(GoToOtherPage);

        public async void GoToOtherPage()
        {
            await App.Navigation.PushAsync(new OtherPage());
        }
    }

解决方法

问题不在于登录,而在于 HomePageViewModel,它最初引用了 App.Navigation(请参阅相关更新)。

将导航传入我的 ViewModel 就成功了:

    public class HomeViewModel
    {
        private readonly INavigation _navigation;

        public Command GoToOtherPageCommand => new Command(GoToOtherPage);

        public async void GoToOtherPage()
        {
            await _navigation.PushAsync(new OtherPage());
        }

        public HomeViewModel(INavigation navigation)
        {
            _navigation = navigation;
        }
    }
    public partial class HomePage : ContentPage
    {
        public HomePage()
        {
            InitializeComponent();
            BindingContext = new HomeViewModel(Navigation);
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。