C# Xamarin Forms MessagingCenter 不更新项目通过

C# Xamarin Forms MessagingCenter not updating Item passed

我正在使用 MessagingCenter 通过我的页面传递对象,从我的 LoginPage 到我的 MainPage。 即使 object 已更新,但在我的主页上使用它时,该对象似乎为空。

    public User sUser { get; set; }
    public MainPage()
    {
        InitializeComponent();

        MessagingCenter.Subscribe<LoginPage, User>(this, "currentUserMainPage", (obj, item) =>
        {
            sUser = item;
            Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
        });

        MasterBehavior = MasterBehavior.Popover;

        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);
    }

当我在更改页面之前检查对象时,即使它不再为 null,它 returns 我还是 null。

public async Task NavigateFromMenu(int id)
    {
        if (!MenuPages.ContainsKey(id))
        {
            switch (id)
            {
                case (int)MenuItemType.Profile:
                    if(sUser == null)
                    {
                        MenuPages.Add(id, new NavigationPage(new LoginPage(sUser)));
                    }
                    else
                    {
                        MenuPages.Add(id, new NavigationPage(new ProfilePage(sUser)));
                    }
                    break;
            }
        }
    }

知道我错过了什么吗?

编辑:这里是来自登录页面的调用

protected override async void OnAppearing()
    {
        base.OnAppearing();

        try
        {
            //perform login
             MessagingCenter.Send(this, "currentUserMainPage", aUser.User);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        
    }

首先你可以查看MessageCenter文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/messaging-center

订阅和发送消息时,我们需要保持参数的数量和类型相同。

例子如下:

发布消息: MessagingCenter.Send<MainPage, string>(this, "Hi", "John");

订阅消息:

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

你会看到第一个参数是 MainPage ,第二个是 string 。都需要在发布或者订阅的时候设置。

另外,不同页面之间使用MessageCenter或者类,可以用object代替或者MainPage.

因此,共享代码可以修改如下:

正在使用 object 订阅 MessageCenter :

MessagingCenter.Subscribe<object, User>(this, "currentUserMainPage", (obj, item) =>
{
    sUser = item;
    Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
});

并发送消息也用 object :

MessagingCenter.Send<object,User>(this, "currentUserMainPage", aUser.User);